Sample definition of ad_form


ad_form \
-name task \
-cancel_url $return_url \
-action $action_url \
-actions $actions \
-has_edit 1 \
-mode $form_mode \
-export {next_url user_id return_url} \
-form {
task_id:key
{task_name:text(text) {label "[_ intranet-timesheet2-tasks.Name]"} {html {size 50}} {help_text $full_name_help}}
{task_nr:text(text) {label "[_ intranet-timesheet2-tasks.Short_Name]"} {html {size 30}} {help_text $short_name_help}}
{project_id:text(select) {label "[_ intranet-core.Project]"} {options $parent_project_options} {help_text $project_help}}
{material_id:text(select) {label "[_ intranet-timesheet2-tasks.Material]"} {options $material_options} {help_text $material_help}}
{cost_center_id:text(select),optional {label "[_ intranet-timesheet2-tasks.Cost_Center]"} {options $cost_center_options} {help_text $cost_center_help}}
{task_type_id:text(hidden) {label "[_ intranet-timesheet2-tasks.Type]"} {options $type_options} }
{task_status_id:text(im_category_tree) {label "[_ intranet-timesheet2-tasks.Status]"} {custom {category_type "Intranet Project Status"}}}
{uom_id:text(select) {label "[_ intranet-timesheet2-tasks.UoM]
([_ intranet-timesheet2-tasks.Unit_of_Measure])"} {options $uom_options}}
}

Sample definition of template::form

template::form::create $form_id
template::form::section $form_id ""
template::element::create $form_id project_id -widget "hidden"
template::element::create $form_id supervisor_id -widget "hidden" -optional
template::element::create $form_id workflow_case_id -widget "hidden" -optional
template::element::create $form_id requires_report_p -widget "hidden" -optional -datatype text
template::element::create $form_id workflow_key -widget "hidden" -optional -datatype text
template::element::create $form_id return_url \
-widget "hidden" \
-optional \
-datatype text
template::element::create $form_id project_name \
-datatype text\
-label "[_ intranet-core.Project_Name]" \
-html {size 40} \
-after_html "[im_gif help "Please enter any suitable name for the project. The name must be unique."]"

Get form:

var oForm = document.getElementById('project-ae');

Browse through elements of a form:

          for (i = oForm.cost_object_category_id.options.length-1; i >= 0; i--) {
                oForm.cost_object_category_id.remove(i);
            }

Check existence of element:

if (document.getElementById("sideBarTab") != null) {
...
}

Get element:

document.getElementById('slave_content').style.visibility='visible';

Get element attribute:

document.getElementById('sidebar').getAttribute('savedHeight')

Inserting elements:

var node_insert_after=document.getElementById("slave");
var node_to_move=document.getElementById("fullwidth-list");
document.getElementById("monitor_frame").insertBefore(node_to_move, node_insert_after.nextSibling);

Get value of a drop down in a form:

var oForm = document.getElementById(‘project-ae’);
var company_id = oForm.elements["company_id"].options[oForm.elements["company_id"].selectedIndex].value;

Get ancestor:
select tree_ancestor_key('1000000000000000111010101100110000000000000000000000000100001001', 1);

Get level:
select tree_level('1000000000000000111010101100110000000000000000000000000100001001');

Get direct parent:

select
parent.project_id
from
im_projects parent,
im_projects child
where child.project_id = :project_id and
tree_ancestor_key(child.tree_sortkey, tree_level(child.tree_sortkey)-1) = parent.tree_sortkey

Links:
Using tree_sortkey for hierarchical queries in Postgres
OpenACS Doku: Hierarchical data

tcl: Continue line using backslash

1) Make sure there’s no backspace after the backslash !
2) No breaks allowed within function call

This won’t work:

                [im_do_row [array get bgcolor] $ctr $curr_owner_id \
                                $owner_name \
                                $days \
                                [array get user_days] \
                                [array get user_absences] \
                                $holydays \
                                $today_date \
                                [array get user_ab_descr] \
                                $workflow_key \
                           ]

OpenACS: Watch packages

  • AOLServer restart sets back watches
  • CVS settings (watch) could lead to additional dirs Base/Baseserv containing a second version of lib files

pgsql

# select project_id from im_projects where parent_id = NULL;
 project_id
------------
(0 rows)

# select project_id from im_projects where parent_id IS NULL;
 project_id
------------
      35116
      35417
(2 rows)
Jun 092011

Messages

Ext.example.msg('Date Selected', 'You choose {0}.', Ext.Date.format(date, 'M j, Y'));

Sample REST Post

Get an object together with its attributes

        var clickHandlerAcceptQuote = function(project_id) {
                var xmlAsString = '380';
                Ext.Ajax.request({
                        url: '/intranet-rest/im_project/' + project_id + '?format=xml',
                        method: 'POST',
                        xmlData: xmlAsString,
                        success: function(o) {
                                if (o.responseText == 0) {
                                        field.markInvalid('Email already in use, please login');
                                }
                        }
                });
        };

Get a category

var ticketAreaStore = Ext.create('PO.data.CategoryStore', {
        storeId:        'ticketAreaStore',
        model: 'TicketBrowser.Category',
        remoteFilter:   true,
        autoLoad:       false,
        pageSize:       1000,
        proxy: {
                type: 'rest',
                url: '/intranet-rest/im_category',
                appendId: true,
                extraParams: {
                        format: 'json',
                        category_type: '\'Intranet Sencha Ticket Tracker Area\''
                },
                reader: { type: 'json', root: 'data' }
        }
});

Get a File Storage Object

// Local store definition.
// We have to redefine the store every time we show
// files for a different ticket
var fileStorageStore = Ext.create('Ext.data.Store', {
        model:  'TicketBrowser.FileStorage',
        storeId:        'fileStorageStore',
        autoLoad:       false,
        remoteSort:     true,
        pageSize:       5,                      // Enable pagination
        sorters:        [{
        property:       'name',
        direction:      'DESC'
        }],
        proxy:  {
        type:   'rest',
        url:    '/intranet-rest/file_storage_object',
        appendId:       true,
        extraParams:    { format: 'json', parent_id: 0 },
        reader: { type: 'json', root: 'data' }
        }
});

Conventions:

var naming:
Place holders (renderTo): Add ‘_ph’
Example: “grid_uploaded_files_ph”

Mar 022011
 
;; default to better frame titles
(setq frame-title-format
      (concat  "%b - emacs@" (system-name)))
 
;; default to unified diffs
(setq diff-switches "-u")
 
(setq scroll-step 1)
(mouse-wheel-mode t)
 
(setq mouse-wheel-progressive-speed nil)
 
(setq scroll-margin 1
scroll-conservatively 0
scroll-up-aggressively 0.01
scroll-down-aggressively 0.01)
 
(global-set-key '[(f12)]          'call-last-kbd-macro)
(global-set-key '[(shift f12)]    'toggle-kbd-macro-recording-on)
 
    (defun toggle-kbd-macro-recording-on ()
      "One-key keyboard macros: turn recording on."
      (interactive)
      (define-key
        global-map
        (events-to-keys (this-command-keys) t)
        'toggle-kbd-macro-recording-off)
      (start-kbd-macro nil))
 
    (defun toggle-kbd-macro-recording-off ()
      "One-key keyboard macros: turn recording off."
      (interactive)
      (define-key
        global-map
        (events-to-keys (this-command-keys) t)
        'toggle-kbd-macro-recording-on)
      (end-kbd-macro))
 
;; turn on font-lock mode
 (when (fboundp 'global-font-lock-mode)
  (global-font-lock-mode t))
 
;; set TAB width
(setq default-tab-width 4)
 
; change TAB behaviour 
(defvar just-tab-keymap (make-sparse-keymap) "Keymap for just-tab-mode")
(define-minor-mode just-tab-mode
  "Just want the TAB key to be a TAB"
  :global t :lighter " TAB" :init-value 0 :keymap just-tab-keymap
  (define-key just-tab-keymap (kbd "TAB") 'indent-for-tab-command))

Links:
http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/

Search Box with Filter and Large Drop Down Menu

http://tympanus.net/codrops/2010/07/14/ui-elements-search-box/

http://www.web-delicious.com/jquery-plugins/

http://www.autohotkey.com/

http://www.vasanth.in/content/binary/Intellitype.ahk

http://www.autohotkey.com/docs/scripts/

http://www.donationcoder.com/Software/Skrommel/index.html#AutoClip

Sanity checks

Scripts that require sanity checks

  • Add column to table

Scripts not requiring additional sanity checks

  • “im_menu__new” checks if menu item already exists
  • “im_component_plugin__new” checks if plugin already exists

Create privileges

-- New Privilege to allow accounting guys to change hours
select acs_privilege__create_privilege('add_hours_all','Edit Hours All','Edit Hours All');
select acs_privilege__add_child('admin', 'add_hours_all');

select im_priv_create('add_hours_all', 'Accounting');
select im_priv_create('add_hours_all', 'P/O Admins');
select im_priv_create('add_hours_all', 'Senior Managers');

Sample Script ‘Add Column’

create or replace function inline_0 ()
returns integer as '
declare
        v_count         integer;
begin
        select count(*) into v_count from information_schema.columns where
              table_name = ''acs_object_types''
              and column_name = ''icon_path'';

user_tab_columns
        where lower(table_name) = ''acs_object_types'' and lower(column_name) = ''icon_path'';
        IF v_count > 0 THEN return 1; END IF;

        alter table acs_object_types add column icon_path character varying(100);
        RETURN 0;

end;' language 'plpgsql';
select inline_0 ();
drop function inline_0 ();

Check existence of column:

        select count(*) into v_count from information_schema.columns where
              table_name = ''acs_object_types''
              and column_name = ''icon_path'';

Check existence of table:

select count(*) into v_count from pg_tables where tablename = ''im_capacity_planning'';

Check for existing constraints

        select count(*) into v_count from pg_constraint
        where lower(conname) = ''im_hours_project_fk'';

Check existence of index:

        select count(*) into v_count
        from pg_indexes
        where tablename = ''im_tickets'' and indexname = ''im_ticket_type_id_idx'';

Create categories

SELECT im_category_new (16006, 'Rejected', 'Intranet Absence Status');

Create menu item

SELECT im_new_menu(
        'intranet-timesheet2',
        'timesheet2_absences_bankholiday',
        'New Bank Holiday',
        '/intranet-timesheet2/absences/new?absence_type_id=5004',
        50,
        'timesheet2_absences',
        null
);

Create menu permissions

SELECT im_new_menu_perms('timesheet2_absences_bankholiday', 'Employees');

Debugging

RAISE NOTICE 'workflow_case__notify_assignee: Subject=%, Body=%', v_subject, v_body;