Merge pull request #11365 from Kyep/id_card_tracking

Upgrades ID Computer
This commit is contained in:
variableundefined
2019-04-30 13:28:03 +08:00
committed by GitHub
11 changed files with 325 additions and 61 deletions
+83
View File
@@ -8,6 +8,8 @@ SUBSYSTEM_DEF(jobs)
var/list/name_occupations = list() //Dict of all jobs, keys are titles
var/list/type_occupations = list() //Dict of all jobs, keys are types
var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain
var/list/id_change_records = list() // List of all job transfer records
var/list/id_change_counter = 1
//Players who need jobs
var/list/unassigned = list()
//Debug info
@@ -601,3 +603,84 @@ SUBSYSTEM_DEF(jobs)
spawn(0)
to_chat(H, "<span class='boldnotice'>Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]</span>")
/datum/controller/subsystem/jobs/proc/format_jobs_for_id_computer(obj/item/card/id/tgtcard)
var/list/jobs_to_formats = list()
if(tgtcard)
var/mob/M = tgtcard.getPlayer()
for(var/datum/job/job in occupations)
if(tgtcard.assignment && tgtcard.assignment == job.title)
jobs_to_formats[job.title] = "disabled" // the job they already have is pre-selected
else if(!job.would_accept_job_transfer_from_player(M))
jobs_to_formats[job.title] = "linkDiscourage" // karma jobs they don't have available are discouraged
else if(job.total_positions && !job.current_positions && job.title != "Civilian")
jobs_to_formats[job.title] = "linkEncourage" // jobs with nobody doing them at all are encouraged
else if(job.total_positions >= 0 && job.current_positions >= job.total_positions)
jobs_to_formats[job.title] = "linkDiscourage" // jobs that are full (no free positions) are discouraged
return jobs_to_formats
/datum/controller/subsystem/jobs/proc/log_job_transfer(transferee, oldvalue, newvalue, whodidit)
id_change_records["[id_change_counter]"] = list("transferee" = transferee, "oldvalue" = oldvalue, "newvalue" = newvalue, "whodidit" = whodidit, "timestamp" = station_time_timestamp())
id_change_counter++
/datum/controller/subsystem/jobs/proc/slot_job_transfer(oldtitle, newtitle)
var/datum/job/oldjobdatum = SSjobs.GetJob(oldtitle)
var/datum/job/newjobdatum = SSjobs.GetJob(newtitle)
if(istype(oldjobdatum) && oldjobdatum.current_positions > 0 && istype(newjobdatum))
if(!(oldjobdatum.title in command_positions) && !(newjobdatum.title in command_positions))
oldjobdatum.current_positions--
newjobdatum.current_positions++
/datum/controller/subsystem/jobs/proc/fetch_transfer_record_html(var/centcom)
var/record_html = "<TABLE border=\"1\">"
var/table_headers = list("Crewman", "Old Rank", "New Rank", "Authorized By", "Time")
var/hidden_fields = list("deletedby")
if(centcom)
table_headers += "<span class='bad'>Deleted By</span>"
record_html += "<TR>"
for(var/thisheader in table_headers)
record_html += "<TD><B>[thisheader]</B></TD>"
record_html += "</TR>"
var/visible_record_count = 0
for(var/thisid in id_change_records)
var/thisrecord = id_change_records[thisid]
if(thisrecord["deletedby"] && !centcom)
continue
record_html += "<TR>"
for(var/lkey in thisrecord)
if(lkey in hidden_fields)
if(centcom)
record_html += "<TD><span class='bad'>[thisrecord[lkey]]<span></TD>"
else
continue
else
record_html += "<TD>[thisrecord[lkey]]</TD>"
record_html += "</TR>"
visible_record_count++
record_html += "</TABLE>"
if(!visible_record_count)
return "No records on file yet."
return record_html
/datum/controller/subsystem/jobs/proc/delete_log_records(sourceuser, delete_all)
. = 0
if(!sourceuser)
return
var/list/new_id_change_records = list()
for(var/thisid in id_change_records)
var/thisrecord = id_change_records[thisid]
if(!thisrecord["deletedby"])
if(delete_all || thisrecord["whodidit"] == sourceuser)
thisrecord["deletedby"] = sourceuser
.++
new_id_change_records["[id_change_counter]"] = thisrecord
id_change_counter++
id_change_records = new_id_change_records
+1
View File
@@ -29,6 +29,7 @@
var/memory
var/assigned_role //assigned role is what job you're assigned to when you join the station.
var/playtime_role //if set, overrides your assigned_role for the purpose of playtime awards. Set by IDcomputer when your ID is changed.
var/special_role //special roles are typically reserved for antags or roles like ERT. If you want to avoid a character being automatically announced by the AI, on arrival (becuase they're an off station character or something); ensure that special_role and assigned_role are equal.
var/offstation_role = FALSE //set to true for ERT, deathsquad, abductors, etc, that can go from and to z2 at will and shouldn't be antag targets
var/list/restricted_roles = list()
+9
View File
@@ -256,6 +256,8 @@
if(H.mind && H.mind.initial_account)
C.associated_account_number = H.mind.initial_account.account_number
C.owner_uid = H.UID()
C.owner_ckey = H.ckey
/datum/outfit/job/proc/imprint_pda(mob/living/carbon/human/H)
var/obj/item/pda/PDA = H.wear_pda
@@ -265,3 +267,10 @@
PDA.ownjob = C.assignment
PDA.ownrank = C.rank
PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
/datum/job/proc/would_accept_job_transfer_from_player(mob/player)
if(!guest_jobbans(title)) // actually checks if job is a whitelisted position
return TRUE
if(!istype(player))
return FALSE
return is_job_whitelisted(player, title)
+3 -2
View File
@@ -257,13 +257,14 @@ var/global/list/role_playtime_requirements = list(
play_records[rtype] = text2num(read_records[rtype])
else
play_records[rtype] = 0
if(mob.stat == CONSCIOUS && mob.mind.assigned_role)
var/myrole = mob.mind.playtime_role ? mob.mind.playtime_role : mob.mind.assigned_role
if(mob.stat == CONSCIOUS && myrole)
play_records[EXP_TYPE_LIVING] += minutes
if(announce_changes)
to_chat(mob,"<span class='notice'>You got: [minutes] Living EXP!")
for(var/category in exp_jobsmap)
if(exp_jobsmap[category]["titles"])
if(mob.mind.assigned_role in exp_jobsmap[category]["titles"])
if(myrole in exp_jobsmap[category]["titles"])
play_records[category] += minutes
if(announce_changes)
to_chat(mob,"<span class='notice'>You got: [minutes] [category] EXP!")
+54 -18
View File
@@ -66,14 +66,15 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card/proc/get_target_rank()
return modify && modify.assignment ? modify.assignment : "Unassigned"
/obj/machinery/computer/card/proc/format_jobs(list/jobs)
/obj/machinery/computer/card/proc/format_jobs(list/jobs, targetrank, list/jobformats)
var/list/formatted = list()
for(var/job in jobs)
if(job_in_department(SSjobs.GetJob(job)))
formatted.Add(list(list(
"display_name" = replacetext(job, " ", "&nbsp;"),
"target_rank" = get_target_rank(),
"job" = job)))
"target_rank" = targetrank,
"job" = job,
"jlinkformat" = jobformats[job] ? jobformats[job] : null)))
return formatted
@@ -246,6 +247,7 @@ var/time_last_changed_position = 0
data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----"
data["target_rank"] = get_target_rank()
data["scan_name"] = scan ? scan.name : "-----"
data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null
data["authenticated"] = is_authenticated(user)
data["has_modify"] = !!modify
data["account_number"] = modify ? modify.associated_account_number : null
@@ -253,15 +255,19 @@ var/time_last_changed_position = 0
data["all_centcom_access"] = null
data["regions"] = null
data["target_dept"] = target_dept
data["card_is_owned"] = modify && modify.owner_ckey
data["engineering_jobs"] = format_jobs(engineering_positions)
data["medical_jobs"] = format_jobs(medical_positions)
data["science_jobs"] = format_jobs(science_positions)
data["security_jobs"] = format_jobs(security_positions)
data["support_jobs"] = format_jobs(support_positions)
data["civilian_jobs"] = format_jobs(civilian_positions)
data["special_jobs"] = format_jobs(whitelisted_positions)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify)
data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats)
data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats)
data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats)
data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats)
data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats)
data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats)
data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats)
data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats)
data["card_skins"] = format_card_skins(get_station_card_skins())
data["job_slots"] = format_job_slots()
@@ -272,6 +278,9 @@ var/time_last_changed_position = 0
data["cooldown_mins"] = mins
data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds
if(mode == 3 && is_authenticated(user))
data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom())
if(modify)
data["current_skin"] = modify.icon_state
@@ -371,7 +380,7 @@ var/time_last_changed_position = 0
if("assign")
if(is_authenticated(usr) && modify)
var/t1 = href_list["assign_target"]
if(target_dept && modify.assignment == "Unassigned")
if(target_dept && modify.assignment == "Demoted")
visible_message("<span class='notice'>[src]: Demoted individuals must see the HoP for a new job.</span>")
return 0
if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE))
@@ -383,11 +392,12 @@ var/time_last_changed_position = 0
var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
//let custom jobs function as an impromptu alt title, mainly for sechuds
if(temp_t && modify)
SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name)
modify.assignment = temp_t
log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".")
else
var/list/access = list()
if(is_centcom())
if(is_centcom() && islist(get_centcom_access(t1)))
access = get_centcom_access(t1)
else
var/datum/job/jobdatum
@@ -407,6 +417,16 @@ var/time_last_changed_position = 0
if(t1 == "Civilian")
message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name)
SSjobs.slot_job_transfer(modify.rank, t1)
var/mob/living/carbon/human/H = modify.getPlayer()
if(istype(H))
if(jobban_isbanned(H, t1))
message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.")
if(H.mind)
H.mind.playtime_role = t1
modify.access = access
modify.rank = t1
modify.assignment = t1
@@ -436,6 +456,20 @@ var/time_last_changed_position = 0
if("mode")
mode = text2num(href_list["mode_target"])
if("wipe_my_logs")
if(is_authenticated(usr) && is_centcom())
var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE)
if(delcount)
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
SSnanoui.update_uis(src)
if("wipe_all_logs")
if(is_authenticated(usr) && !target_dept)
var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE)
if(delcount)
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
SSnanoui.update_uis(src)
if("print")
if(!printing && !target_dept)
printing = 1
@@ -474,14 +508,15 @@ var/time_last_changed_position = 0
var/jobnamedata = modify.getRankAndAssignment()
log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name)
modify.assignment = "Terminated"
modify.access = list()
callHook("terminate_employee", list(modify))
if("demote")
if(is_authenticated(usr))
if(modify.assignment == "Unassigned")
visible_message("<span class='notice'>[src]: Unassigned crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.</span>")
if(modify.assignment == "Demoted")
visible_message("<span class='notice'>[src]: Demoted crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.</span>")
return 0
if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE))
visible_message("<span class='notice'>[src]: Heads may only demote members of their own department.</span>")
@@ -492,12 +527,13 @@ var/time_last_changed_position = 0
access = jobdatum.get_access()
var/jobnamedata = modify.getRankAndAssignment()
log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".")
message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".")
log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".")
message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Demoted", scan.registered_name)
modify.access = access
modify.rank = "Civilian"
modify.assignment = "Unassigned"
modify.assignment = "Demoted"
modify.icon_state = "id"
if("make_job_available")
@@ -98,6 +98,8 @@
//alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system
var/assignment = null //can be alt title or the actual job
var/rank = null //actual job
var/owner_uid
var/owner_ckey
var/dorm = 0 // determines if this ID has claimed a dorm already
var/sex
@@ -195,6 +197,19 @@
jobnamedata += " (" + assignment + ")"
return jobnamedata
/obj/item/card/id/proc/getPlayer()
if(owner_uid)
var/mob/living/carbon/human/H = locateUID(owner_uid)
if(istype(H) && H.ckey == owner_ckey)
return H
owner_uid = null
if(owner_ckey)
for(var/mob/M in GLOB.player_list)
if(M.ckey && M.ckey == owner_ckey)
owner_uid = M.UID()
return M
owner_ckey = null
/obj/item/card/id/proc/is_untrackable()
return untrackable
@@ -137,18 +137,17 @@
return 1
return -1
/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs)
/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs, targetrank, list/jobformats)
var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
if(!card_slot || !card_slot.stored_card)
return null
var/obj/item/card/id/id_card = card_slot.stored_card
var/list/formatted = list()
for(var/job in jobs)
formatted.Add(list(list(
"display_name" = replacetext(job, "&nbsp", " "),
"target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned",
"job" = job)))
"target_rank" = targetrank,
"job" = job,
"jlinkformat" = jobformats[job] ? jobformats[job] : null)))
return formatted
@@ -225,11 +224,12 @@
var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
//let custom jobs function as an impromptu alt title, mainly for sechuds
if(temp_t && modify)
SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name)
modify.assignment = temp_t
log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".")
else
var/list/access = list()
if(is_centcom)
if(is_centcom && islist(get_centcom_access(t1)))
access = get_centcom_access(t1)
else
var/datum/job/jobdatum
@@ -249,6 +249,16 @@
if(t1 == "Civilian")
message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name)
SSjobs.slot_job_transfer(modify.rank, t1)
var/mob/living/carbon/human/H = modify.getPlayer()
if(istype(H))
if(jobban_isbanned(H, t1))
message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.")
if(H.mind)
H.mind.playtime_role = t1
modify.access = access
modify.assignment = t1
modify.rank = t1
@@ -271,6 +281,18 @@
if("PRG_mode")
mode = text2num(href_list["mode_target"])
if("PRG_wipe_my_logs")
if(is_authenticated(usr) && is_centcom)
var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE)
if(delcount)
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
if("PRG_wipe_all_logs")
if(is_authenticated(usr))
var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE)
if(delcount)
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
if("PRG_print")
if(!printing && computer)
printing = 1
@@ -312,6 +334,7 @@
var/jobnamedata = modify.getRankAndAssignment()
log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name)
modify.assignment = "Terminated"
modify.access = list()
callHook("terminate_employee", list(modify))
@@ -398,6 +421,7 @@
data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----"
data["target_rank"] = get_target_rank()
data["scan_name"] = scan ? scan.name : "-----"
data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null
data["authenticated"] = is_authenticated(user)
data["has_modify"] = !!modify
data["account_number"] = modify ? modify.associated_account_number : null
@@ -405,14 +429,17 @@
data["all_centcom_access"] = null
data["regions"] = null
data["engineering_jobs"] = format_jobs(engineering_positions)
data["medical_jobs"] = format_jobs(medical_positions)
data["science_jobs"] = format_jobs(science_positions)
data["security_jobs"] = format_jobs(security_positions)
data["support_jobs"] = format_jobs(support_positions)
data["civilian_jobs"] = format_jobs(civilian_positions)
data["special_jobs"] = format_jobs(whitelisted_positions)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify)
data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats)
data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats)
data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats)
data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats)
data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats)
data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats)
data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats)
data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats)
data["card_skins"] = format_card_skins(get_station_card_skins())
data["job_slots"] = format_job_slots()
@@ -423,6 +450,9 @@
data["cooldown_mins"] = mins
data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds
if(mode == 3 && is_authenticated(user))
data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom)
if(modify)
data["current_skin"] = modify.icon_state
File diff suppressed because one or more lines are too long
+22 -1
View File
@@ -1,4 +1,4 @@
.link, .linkOn, .linkOff, .selected, .disabled, .yellowButton, .redButton {
.link, .linkOn, .linkOff, .selected, .disabled, .yellowButton, .redButton, .linkEncourage, .linkDiscourage {
float: left;
min-width: 15px;
height: 16px;
@@ -82,6 +82,27 @@ a.icon img, .linkOn.icon img, .linkOff.icon img, .selected.icon img, .disabled.i
background-color: #ff6666;
}
.linkEncourage, a.linkEncourage:link, a.linkEncourage:visited, a.linkEncourage:active {
color: #99ff33;
background-color: #40628a;
border-color: #161616;
}
.linkEncourage.hover {
background-color: #507aac;
}
.linkDiscourage, a.linkDiscourage:link, a.linkDiscourage:visited, a.linkDiscourage:active {
color: #8c8c8c;
background-color: #40628a;
border-color: #161616;
}
.linkDiscourage.hover {
color: #ff0000;
background-color: #507aac;
}
.inactive, a.inactive:link, a.inactive:visited, a.inactive:active, a.inactive.hover {
color: #ffffff;
background: #999999;
+41 -10
View File
@@ -11,6 +11,7 @@
{{:helper.link('Job Management', 'gear', {'action' : 'PRG_mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}
{{:helper.link('Crew Manifest', 'folder-open', {'action' : 'PRG_mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}}
{{:helper.link('Print', 'print', {'action' : 'PRG_print'}, data.printer && (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}
{{:helper.link('Records', 'file', {'action' : 'PRG_mode', 'mode_target' : 3}, (data.mode == 3) ? 'disabled' : null)}}
{{if data.mode == 1}}
<div class='item'>
@@ -52,6 +53,31 @@
<div class='item'>
{{:data.manifest}}
</div>
{{else data.mode == 3}}
<div class='item'>
<h2>Records</h2>
</div>
<div class='item'>
<div class='itemLabel'>
Authorized Identity:
</div>
<div class='itemContent'>
{{:helper.link(data.scan_name, 'eject', {'action' : 'scan'})}}
</div>
</div>
<div class='item'>
{{if data.authenticated}}
{{:data.id_change_html}}
{{if data.centcom_access}}
{{:helper.link('Delete Records By: ' + data.scan_owner, null, {'action' : 'PRG_wipe_my_logs'}, null, 'linkDanger')}}
{{/if}}
{{if !data.target_dept}}
{{:helper.link('Delete ALL Records', null, {'action' : 'PRG_wipe_all_logs'}, null, 'linkDanger')}}
{{/if}}
{{else}}
<span class='exclamation-triangle'><i>Please insert an authorized ID into the terminal to proceed.</i></span><br>
{{/if}}
</div>
{{else}}
<div class='item'>
<h2>Access Modification</h2>
@@ -149,7 +175,11 @@
Terminations:
</div>
<div class='itemContent'>
{{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}}
{{if data.target_rank == "Terminated"}}
<span class='bad'>{{:data.target_owner}} has already been terminated!</span>
{{else}}
{{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}}
{{/if}}
</div>
</div>
@@ -168,15 +198,16 @@
<tr>
<th>Special</th>
<td>
{{:helper.link("Captain", '', {'action' : 'PRG_assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}}
{{:helper.link("Custom", '', {'action' : 'PRG_assign', 'assign_target' : 'Custom'})}}
{{for data.top_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
<tr>
<th style="color: '#FFA500';">Engineering</th>
<td>
{{for data.engineering_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -184,7 +215,7 @@
<th style="color: '#008000';">Medical</th>
<td>
{{for data.medical_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -192,7 +223,7 @@
<th style="color: '#DD0000';">Security</th>
<td>
{{for data.security_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -200,7 +231,7 @@
<th style="color: '#C060C0';">Science</th>
<td>
{{for data.science_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -208,7 +239,7 @@
<th style="color: '#A0A0A0';">Support</th>
<td>
{{for data.support_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -216,7 +247,7 @@
<th style="color: '#808080';">Civilian</th>
<td>
{{for data.civilian_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -225,7 +256,7 @@
<th style="color: '#A52A2A';">CentComm</th>
<td>
{{for data.centcom_jobs}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
+51 -14
View File
@@ -11,7 +11,8 @@
{{if !data.target_dept}}{{:helper.link('Job Management', 'gear', {'choice' : 'mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}{{/if}}
{{:helper.link('Crew Manifest', 'folder-open', {'choice' : 'mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}}
{{if !data.target_dept}}{{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}{{/if}}
{{:helper.link('Records', 'file', {'choice' : 'mode', 'mode_target' : 3}, (data.mode == 3) ? 'disabled' : null)}}
{{if data.mode == 1 && !data.target_dept}}
<div class='item'>
<h2>Job Management</h2>
@@ -52,6 +53,31 @@
<div class='item'>
{{:data.manifest}}
</div>
{{else data.mode == 3}}
<div class='item'>
<h2>Records</h2>
</div>
<div class='item'>
<div class='itemLabel'>
Authorized Identity:
</div>
<div class='itemContent'>
{{:helper.link(data.scan_name, 'eject', {'choice' : 'scan'})}}
</div>
</div>
<div class='item'>
{{if data.authenticated}}
{{:data.id_change_html}}
{{if data.centcom_access}}
{{:helper.link('Delete Records By: ' + data.scan_owner, null, {'choice' : 'wipe_my_logs'}, null, 'linkDanger')}}
{{/if}}
{{if !data.target_dept}}
{{:helper.link('Delete ALL Records', null, {'choice' : 'wipe_all_logs'}, null, 'linkDanger')}}
{{/if}}
{{else}}
<span class='exclamation-triangle'><i>Please insert an authorized ID into the terminal to proceed.</i></span><br>
{{/if}}
</div>
{{else}}
<div class='item'>
<h2>Access Modification</h2>
@@ -145,21 +171,31 @@
</div>
</form>
{{/if}}
<div class='item'>
{{if data.target_rank != "Terminated"}}
<div class='item'>
<div class='itemLabel'>
Demotions:
</div>
<div class='itemContent'>
{{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : 'linkDanger')}}
{{if data.target_rank == "Demoted"}}
<span class='bad'>{{:data.target_owner}} has already been demoted!</span>
{{else}}
{{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned") ? 'disabled' : 'linkDanger')}}
{{/if}}
</div>
</div>
{{/if}}
{{if !data.target_dept}}
<div class='item'>
<div class='itemLabel'>
Terminations:
</div>
<div class='itemContent'>
{{:helper.link('Terminate ' + data.target_owner, 'gear', {'choice' : 'terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}}
{{if data.target_rank == "Terminated"}}
<span class='bad'>{{:data.target_owner}} has already been terminated!</span>
{{else}}
{{:helper.link('Terminate ' + data.target_owner, 'gear', {'choice' : 'terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}}
{{/if}}
</div>
</div>
@@ -187,8 +223,9 @@
<tr>
<th>Special</th>
<td>
{{:helper.link("Captain", '', {'choice' : 'assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}}
{{:helper.link("Custom", '', {'choice' : 'assign', 'assign_target' : 'Custom'})}}
{{for data.top_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
{{/if}}
@@ -197,7 +234,7 @@
<th style="color: '#FFA500';">Engineering</th>
<td>
{{for data.engineering_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -207,7 +244,7 @@
<th style="color: '#008000';">Medical</th>
<td>
{{for data.medical_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -217,7 +254,7 @@
<th style="color: '#DD0000';">Security</th>
<td>
{{for data.security_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -227,9 +264,9 @@
<th style="color: '#C060C0';">Science</th>
<td>
{{for data.science_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</td>
</tr>
{{/if}}
{{if !data.target_dept}}
@@ -237,7 +274,7 @@
<th style="color: '#A0A0A0';">Support</th>
<td>
{{for data.support_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -246,7 +283,7 @@
<th style="color: '#808080';">Civilian</th>
<td>
{{for data.civilian_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>
@@ -255,7 +292,7 @@
<th style="color: '#A52A2A';">CentComm</th>
<td>
{{for data.centcom_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}}
{{/for}}
</td>
</tr>