view release on metacpan or search on metacpan
share/js/dochazka-www/caches.js view on Meta::CPAN
} else {
console.log("There is no schedule interval after eolei");
[beginTime, endTime] = dt.canonicalizeTimeRangeOffset(eolei + String(offset));
}
populateLastPlusOffsetFormFields(beginTime + '-' + endTime);
populateContinue(populateArray);
},
populateLastPlusOffsetFormFields = function (buf) {
var formField = $('#iNlastplusoffset'),
formInput = $('input[id="iNtimerange"');
formField.html(String(buf));
formInput.val(String(buf));
},
populateNextScheduled = function (populateArray) {
var cu = currentUser('obj'),
schedIntvls = $('#iNschedintvls').text(),
m, sid, date, rest, sc, fc, populateContinue;
date = $("#iNdate").text();
console.log("Entering populateNextScheduled() with date " + date);
share/js/dochazka-www/caches.js view on Meta::CPAN
"body": {
'clobber': '0',
'tsrange': fullDayTsrange(date),
'dry_run': '1',
'eid': String(cu.eid),
},
};
sc = function (st) {
if (st.code === "DISPATCH_SCHEDULED_INTERVALS_IDENTIFIED") {
appLib.displayIntervals([st.payload.success.intervals[0]], $('#iNnextscheduled'));
$('input[id="iNtimerange"]').val(
dt.tsrangeToTimeRange(st.payload.success.intervals[0].intvl)
);
} else {
if (date) {
m = "No unfulfilled scheduled intervals for " + date;
} else {
m = "No date given";
}
console.log("ERROR: " + m);
coreLib.displayError(m);
share/js/dochazka-www/dform-init.js view on Meta::CPAN
target
) {
return function () {
target.push('createLastPlusOffset', {
// before doing any calculations, look up:
// - employee's schedule
// - schedule intervals on date
// - existing intervals on date
// timerange start will be:
// - end of last existing interval, if there are existing intervals
// - start of first schedule interval, if there are schedule intervals
// - 00:00 otherwise
// timerange end will be timerange start plus offset
'name': 'createLastPlusOffset',
'type': 'dform',
'menuText': "Last plus offset",
'title': "Create interval \"last plus offset\"",
'preamble': "You entered an offset without a start time. Deriving start " +
"time from schedule and last existing interval (if any).",
'aclProfile': 'active',
'entriesRead': [
entries.acTaid,
entries.iNsid,
share/js/dochazka-www/dform-init.js view on Meta::CPAN
entries.iNactHidden,
entries.iNschedintvls,
entries.iNlastexistintvl,
entries.iNoffset,
entries.iNlastplusoffset,
coreLib.emptyLineEntry,
entries.iNtoBeCreated,
],
'entriesWrite': [
entries.iNdate,
entries.iNtimerange,
entries.iNact,
entries.iNdesc,
],
'rememberState': true,
'miniMenu': {
entries: ['createSingleIntSave'],
}
}); // createLastPlusOffset
target.push('createMultipleInt', {
share/js/dochazka-www/dform-init.js view on Meta::CPAN
'miniMenu': {
entries: ['selectActivityAction', 'createMultipleIntSave', 'viewIntervalsAction']
}
}); // createMultipleInt
target.push('createNextScheduled', {
// before doing any calculations, look up/calculate:
// - employee's schedule
// - existing intervals on date
// - schedule intervals on date
// timerange will be:
// - first schedule interval that does not conflict/overlap with an existing interval
'name': 'createNextScheduled',
'type': 'dform',
'menuText': "Next scheduled interval",
'title': "Create interval \"next scheduled\"",
'aclProfile': 'active',
'entriesRead': [
entries.acTaid,
entries.iNsid,
entries.iNdateHidden,
entries.iNactHidden,
entries.iNschedintvls,
entries.iNexistintvls,
entries.iNnextscheduled,
coreLib.emptyLineEntry,
entries.iNtoBeCreated,
],
'entriesWrite': [
entries.iNdate,
entries.iNtimerange,
entries.iNact,
entries.iNdesc,
],
'rememberState': true,
'miniMenu': {
entries: ['selectActivityAction', 'createSingleIntSave'],
}
}); // createNextScheduled
target.push('createSingleInt', {
share/js/dochazka-www/dform-init.js view on Meta::CPAN
'type': 'dform',
'menuText': 'Create',
'title': 'Create an arbitrary interval',
'preamble': "Hints: (1) TAB or ENTER to validate and advance to next field " +
"(2) date YYYY-MM-DD; year is optional " +
"(3) time range HH:MM-HH:MM or HH:MM+HH:MM (start time plus offset) " +
"or +HH:MM (last existing interval plus offset) or + (next scheduled " +
"interval) (4) Use 'Select activity' if you don't know activity code " +
'(5) Description is optional',
'aclProfile': 'active',
'entriesWrite': [entries.iNdate, entries.iNtimerange, entries.iNact, entries.iNdesc,],
'rememberState': true,
'miniMenu': {
entries: ['selectActivityAction', 'createSingleIntSave']
}
}); // createSingleInt
target.push('createLock', {
'name': 'createLock',
'type': 'dform',
'menuText': 'Create',
share/js/dochazka-www/dform-init.js view on Meta::CPAN
'name': 'createSingleIntFixedDay',
'type': 'dform',
'menuText': 'Create',
'title': 'Create an arbitrary interval',
'preamble': "Hints: (1) TAB or ENTER to validate and advance to next field " +
"(2) time range HH:MM-HH:MM " +
"(3) Use 'Select activity' if you don't know activity code " +
'(4) Description is optional',
'aclProfile': 'active',
'entriesRead': [entries.iNdate,],
'entriesWrite': [entries.iNtimerangeNoOffset, entries.iNact, entries.iNdesc,],
'rememberState': true,
'miniMenu': {
entries: ['selectActivityAction', 'createSingleIntSave']
}
}); // createSingleIntFixedDay
target.push('displaySingleInt', {
'name': 'displaySingleInt',
'type': 'dform',
'menuText': 'Single interval',
'title': 'Display a single interval',
'aclProfile': 'active',
'entriesRead': [entries.iNdaterange, entries.iNtimerange, entries.iNact, entries.iNdesc,],
'miniMenu': {
entries: []
}
}); // displaySingleInt
target.push('empProfile', {
'name': 'empProfile',
'type': 'dform',
'menuText': 'Profile',
'title': 'Employee profile',
share/js/dochazka-www/dform-init.js view on Meta::CPAN
'name': 'updateSingleInt',
'type': 'dform',
'menuText': 'Update',
'title': 'Update an interval',
'preamble': "Hints: (1) TAB or ENTER to validate and advance to next field " +
"(2) time range HH:MM-HH:MM " +
"(3) Use 'Select activity' if you don't know activity code " +
'(4) Description is optional',
'aclProfile': 'active',
'entriesRead': [entries.iNdate, entries.acTaid],
'entriesWrite': [entries.iNtimerangeNoOffset, entries.iNact, entries.iNdesc,],
'rememberState': true,
'miniMenu': {
entries: ['selectActivityAction', 'updateSingleIntSave']
}
}); // updateSingleInt
target.push('viewIntervalsPrep', {
'name': 'viewIntervalsPrep',
'type': 'dform',
'menuText': 'View',
share/js/dochazka-www/drowselect-init.js view on Meta::CPAN
});
target.push('viewIntervalsDrowselect', {
'name': 'viewIntervalsDrowselect',
'type': 'drowselect',
'menuText': 'View',
'title': 'Intervals in date',
'preamble': null,
'aclProfile': 'passerby',
'entriesRead': [
entries.iNdate, entries.iNtimerange, entries.iNiid, entries.acTcode,
entries.iNshortDesc,
],
'miniMenu': {
entries: ['createSingleIntFixedDay', 'updateSingleInt', 'deleteSingleInt'],
}
}); // viewIntervalsDrowselect
target.push('viewLocksDrowselect', {
'name': 'viewLocksDrowselect',
'type': 'drowselect',
share/js/dochazka-www/entries.js view on Meta::CPAN
iNsid: {
name: 'iNsid',
aclProfileRead: 'inactive',
aclProfileWrite: 'admin',
text: 'Schedule ID',
prop: 'iNsid',
hidden: true,
maxlen: 20,
populate: appCaches.populateSIDByDate,
},
iNtimerange: {
name: 'iNtimerange',
aclProfileRead: 'inactive',
aclProfileWrite: 'inactive',
text: 'Time range',
prop: 'iNtimerange',
maxlen: 20,
vetter: datetime.vetTimeRange,
},
iNtimerangeNoOffset: {
name: 'iNtimerangeNoOffset',
aclProfileRead: 'inactive',
aclProfileWrite: 'inactive',
text: 'Time range',
prop: 'iNtimerange',
maxlen: 20,
vetter: datetime.vetTimeRangeNoOffset,
},
iNtoBeCreated: {
name: 'textOnly',
textOnly: "Interval to be created",
},
iNyear: {
name: 'iNyear',
aclProfileRead: 'inactive',
share/js/dochazka-www/int-lib.js view on Meta::CPAN
console.log("Looking up activity " + obj.code + " in cache");
actObj = appCaches.getActivityByCode(obj.code);
if (! actObj) {
stack.restart(undefined, {
"resultLine": 'Activity ' + obj.code + ' not found'
});
return false;
}
obj.aid = actObj.aid;
}
if (! obj.iNtimerange) {
stack.restart(undefined, {
"resultLine": "Interval time range missing"
});
return false;
}
return true;
},
createMultipleIntSave = function (obj) {
var cu = currentUser('obj'),
share/js/dochazka-www/int-lib.js view on Meta::CPAN
// obj already populated
} else if (caller === 'createLastPlusOffset' || caller === 'createNextScheduled') {
// Scrape time range from form
// (The "createLastPlusOffset" dform has no inputs (writable
// entries); instead, it has spans (read-only entries) that are
// populated asynchronously and obj does not contain any of
// the new values. In this case, the time range is residing
// in one of the spans.)
// Scrape time range from form
obj.iNdate = $('input[id="iNdate"]').val();
obj.iNtimerange = $('input[id="iNtimerange"]').val();
obj.code = $('input[id="iNact"]').val();
obj.long_desc = $('input[id="iNdesc"]').val();
} else {
console.log("CRITICAL ERROR: unexpected caller", caller);
return null;
}
if (obj.iNtimerange === '+') {
stack.push('createNextScheduled', obj);
return null;
}
if (obj.iNtimerange.match(/\+/)) {
obj.iNoffset = obj.iNtimerange;
stack.push('createLastPlusOffset', obj);
return null;
}
if (! createIntervalCheckMandatoryProps(obj)) {
return null;
}
obj["intvl"] = genIntvl(obj.iNdate, obj.iNtimerange);
if (! obj.intvl) {
return null;
}
rest = {
"method": 'POST',
"path": 'interval/new',
"body": {
"eid": cu.eid,
"aid": obj.aid,
"intvl": obj.intvl,
share/js/dochazka-www/int-lib.js view on Meta::CPAN
} else {
coreLib.displayError(st.text);
}
};
console.log("Entering deleteSingleInt() with obj", obj);
ajax(rest, sc);
},
emptyObj = {
"iNdate": "",
"iNtimerange": "",
"code": "",
"long_desc": ""
},
genIntvl = function (date, timerange) {
var ctr = dt.canonicalizeTimeRange(timerange),
m;
if (ctr === null) {
m = 'Time range ->' + timerange + '<- is invalid';
console.log(m);
stack.restart(undefined, {
"resultLine": m
});
} else {
return '[ "' +
date +
' ' +
ctr[0] +
'", "' +
share/js/dochazka-www/int-lib.js view on Meta::CPAN
// set = coreLib.drowselectState.set.slice();
// set[pos] = st.payload;
stack.unwindToTarget('viewIntervalsAction');
};
console.log("Entering updateSingleIntSave() from caller " + caller + " with obj", obj);
if (caller === 'updateSingleInt') {
// obj is scraped by start.js from the form inputs and will look
// like this:
// {
// iNdate: "foo bar in a box",
// iNtimerange: "25:00-27:00",
// code: "LOITERING",
// iid: 148
// long_desc: "none",
// }
// any of the above properties may be present or missing
// also, there may or may not be an acTaid property with the AID of
// the chosen activity
} else {
console.log("CRITICAL ERROR: unexpected caller", caller);
return null;
}
if (! createIntervalCheckMandatoryProps(obj)) {
return null;
}
obj["intvl"] = genIntvl(obj.iNdate, obj.iNtimerange);
if (! obj.intvl) {
return null;
}
rest = {
"method": 'PUT',
"path": 'interval/iid/' + obj.iid,
"body": {
"eid": cu.eid,
"aid": obj.acTaid,
"intvl": obj.intvl,
share/js/dochazka-www/int-lib.js view on Meta::CPAN
firstDate,
i,
multipleDates,
obj,
opts,
rest,
sc = function (st) {
var ld;
if (st.code === 'DISPATCH_RECORDS_FOUND' ) {
opts = { "resultLine": st.count + " intervals found" };
// convert intvl to iNdate and iNtimerange
for (i = 0; i < st.payload.length; i += 1) {
arr = dt.tsrangeToDateAndTimeRange(st.payload[i].intvl);
st.payload[i].iNdate = arr[0];
if (i === 0) {
firstDate = arr[0]; // first date in result set
}
st.payload[i].iNtimerange = arr[1];
}
opts['xtarget'] = 'viewIntervalsPrep'; // so we don't land in viewIntervalsAction
if (multipleDates) {
obj = {
"beginDate": begin,
"endDate": end,
"intervals": st.payload,
};
stack.push('multiDayViewer', obj, opts);
} else {
share/js/dochazka-www/svg-lib.js view on Meta::CPAN
fill = 'font-weight="bold" fill="transparent"';
} else {
fill = 'fill="black"';
}
r += '<svg width="' + absWidth + '" height="30" ' + svgBoilerPlate + '>';
// draw base rectangle
r += '<rect x="5" y="0" width="' + absWidth + '" height="30" fill="gray" stroke="transparent"/>';
// draw attendance intervals
for (i = 0; i < obj.clocked.length; i += 1) {
intvl = obj.clocked[i];
[begin, end] = intvl.iNtimerange.split('-');
[bo, eo] = [timeToOffset(begin), timeToOffset(end)];
color = appCaches.getActivityByAID(intvl.aid).color;
r += '<rect x="' + bo + '" y="0" width="' + (eo - bo) + '" height="30" ' +
'fill="' + color + '" stroke="transparent"/>';
}
// draw schedule intervals
for (i = 0; i < obj.scheduled.length; i += 1) {
intvl = obj.scheduled[i];
[begin, end] = intvl.split('-');
[bo, eo] = [timeToOffset(begin), timeToOffset(end)];
share/js/dochazka-www/viewer.js view on Meta::CPAN
date, tr, aid,
rest = {
"method": "GET",
"path": "holiday/" + tsr,
},
sc = function (st) {
if (st.code === 'DOCHAZKA_HOLIDAYS_AND_WEEKENDS_IN_TSRANGE') {
initializeStore(st.payload);
for (i = 0; i < obj.intervals.length; i += 1) {
aid = obj.intervals[i].aid;
[date, tr] = [obj.intervals[i].iNdate, obj.intervals[i].iNtimerange];
haw[date].clocked.push({"iNtimerange": tr, "aid": aid});
}
addScheduledIntervals(obj);
} else {
throw "unexpected holidays status code " + st.code;
}
};
ajax(rest, sc);
return null;
},