App-Dochazka-WWW

 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;
        },



( run in 2.967 seconds using v1.01-cache-2.11-cpan-49f99fa48dc )