add/edit/delete core org unit objects
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 24 Mar 2008 03:42:10 +0000 (03:42 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 24 Mar 2008 03:42:10 +0000 (03:42 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/branches/dojo-admin@9117 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/web/conify/global/actor/org_unit.html

index 3b1afe1..27ca5be 100644 (file)
@@ -40,6 +40,7 @@
                        dojo.require('conify.fieldmapper.addToHash', true);
                        dojo.require('conify.fieldmapper.addFromHash', true);
                        dojo.require('conify.fieldmapper.addToStoreData', true);
+                       dojo.require('conify.fieldmapper.addFromStoreItem', true);
                        dojo.require('dojo.parser');
                        dojo.require('dojo.data.ItemFileWriteStore');
                        dojo.require('dijit.form.TextBox');
@@ -52,6 +53,7 @@
                        dojo.require('dijit.layout.LayoutContainer');
                        dojo.require('dijit.layout.SplitContainer');
                        dojo.require('dojox.widget.Toaster');
+                       dojo.require('dojox.fx');
                </script>
 
                <script type="text/javascript">
@@ -65,6 +67,9 @@
                        var current_ou;
                        var virgin_ou_id = -1;
 
+                       var ou_type_store = new dojo.data.ItemFileWriteStore({ data : aout.toStoreData( globalOrgTypes ) });
+
+                       var highlighter = {};
                </script>
 
        </head>
 
                                        var ou_list_data = { label : 'shortname', identifier : 'id' };
                
-                                       var req = pCRUD.request({
+                                       pCRUD.request({
                                                method : 'open-ils.permacrud.search.aou.atomic',
                                                timeout : 10,
                                                params : [ ses, { id : { "!=" : null } }, { order_by : { aou : 'shortname' } } ],
                                                onerror : function (r) { throw 'Problem fetching org units';},
-                                       });
-                                       req.send();
+                                               oncomplete : function (r) { window.ou_list_store = new dojo.data.ItemFileWriteStore({ data : aou.toStoreData( r.recv().content() ) }); }
+                                       }).send();
                
-                                       window.ou_type_store = new dojo.data.ItemFileWriteStore({ data : aout.toStoreData( globalOrgTypes ) });
-                                       window.ou_list_store = new dojo.data.ItemFileWriteStore({ data : aou.toStoreData( req.recv().content() ) });
 
                                </script>
                                <div
 
                                        <script type="dojo/method" event="onClick" args="item,node">
 
+                                               highlighter.editor_pane.green.play();
 
                                                new_kid_button.disabled = false;
                                                save_ou_button.disabled = false;
                                                        var field = main_settings_fields[i];
                                                        var value = this.store.getValue( current_ou, field );
 
-                                                       if (!value) window["editor_pane_" + field].setValue( '' ); // unset the value
-                                                       else window["editor_pane_" + field].setValue( value );
+                                                       if (!value) {
+                                                               window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                               window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                       } else window["editor_pane_" + field].setValue( value );
                                                }
 
                                                if ( this.store.getValue( current_ou, '_trueRoot' ) == 'true' ) {
                                                        editor_pane_parent_ou.disabled = true;
                                                        editor_pane_parent_ou.setValue(null);
                                                        editor_pane_parent_ou.setDisplayedValue('');
+                                                       editor_pane_parent_ou.validate(false);
                                                } else {
                                                        editor_pane_parent_ou.disabled = false;
+                                                       editor_pane_parent_ou.validate(true);
                                                        editor_pane_parent_ou.setValue( this.store.getValue( current_ou, 'parent_ou' ) );
                                                }
 
                        <div id="right_tabpane" dojoType="dijit.layout.TabContainer" sizeMin="200" sizeShare="300">
 
                                <div id="editor_pane" dojoType="dijit.layout.ContentPane" title="Main Settings">
+                                       <script type="dojo/method">
+                                               highlighter.editor_pane = {};
+                                               highlighter.editor_pane.green = dojox.fx.highlight( { color : '#B4FFB4', node : 'editor_pane', duration : 500 } );
+                                               highlighter.editor_pane.red = dojox.fx.highlight( { color : '#FF2018', node : 'editor_pane', duration : 500 } );
+                                       </script>
                                        <table class="tundra" style="margin:10px;">
                                                <tr>
                                                        <th>Org Unit Name</th>
                                                        <td>
                                                                <span id="editor_pane_name" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_name" regExp=".+">
                                                                        <script type="dojo/connect" event="onChange">
-                                                                               ou_list_store.setValue( current_ou, "name", this.getValue() );
+                                                                               if (current_ou) ou_list_store.setValue( current_ou, "name", this.getValue() );
                                                                        </script>
                                                                </span>
                                                        </td>
                                                        <td>
                                                                <span id="editor_pane_shortname" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_shortname" uppercase="true" regExp=".+">
                                                                        <script type="dojo/connect" event="onChange">
-                                                                               ou_list_store.setValue( current_ou, "shortname", this.getValue() );
+                                                                               if (current_ou) ou_list_store.setValue( current_ou, "shortname", this.getValue() );
                                                                        </script>
                                                                </span>
                                                        </td>
                                                        <td>
                                                                <span id="editor_pane_email" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_email" regExp="^\w+\@\w+(?:\.\w+)+$">
                                                                        <script type="dojo/connect" event="onChange">
-                                                                               ou_list_store.setValue( current_ou, "email", this.getValue() );
+                                                                               if (current_ou) ou_list_store.setValue( current_ou, "email", this.getValue() );
                                                                        </script>
                                                                </span>
                                                        </td>
                                                        <td>
                                                                <span id="editor_pane_phone" dojoType="dijit.form.ValidationTextBox" jsId="editor_pane_phone" regExp="^(?:(?:\d{1}[ -\.])?\(?\d{3}\)?[ -\.]{1})?\d{3}[ -\.]{1}\d{4}(| \S+.*)$">
                                                                        <script type="dojo/connect" event="onChange">
-                                                                               ou_list_store.setValue( current_ou, "phone", this.getValue() );
+                                                                               if (current_ou) ou_list_store.setValue( current_ou, "phone", this.getValue() );
                                                                        </script>
                                                                </span>
                                                        </td>
                                                                  ignoreCase="true"
                                                                >
                                                                        <script type="dojo/method" event="onChange">
-                                                                               ou_list_store.setValue( current_ou, "ou_type", this.getValue() );
+                                                                               if (current_ou) ou_list_store.setValue( current_ou, "ou_type", this.getValue() );
                                                                        </script>
                                                                </div>
                                                        </td>
                                                                  ignoreCase="true"
                                                                >
                                                                        <script type="dojo/method" event="onChange">
-                                                                               this.store.setValue( current_ou, "parent_ou", this.getValue() );
+                                                                               if (current_ou) this.store.setValue( current_ou, "parent_ou", this.getValue() );
                                                                        </script>
                                                                </div>
                                                        </td>
                                                                  value='t'
                                                                >
                                                                        <script type="dojo/connect" event="onChange">
-                                                                               ou_list_store.setValue( current_ou, "opac_visible", this.isChecked() ? "t":"f" );
+                                                                               if (current_ou) ou_list_store.setValue( current_ou, "opac_visible", this.isChecked() ? "t":"f" );
                                                                        </script>
                                                                </input>
                                                        </td>
                                                </tr>
                                        </table>
 
-                                       <div dojoType="dijit.layout.ContentPane" orientation="horizontal" style="margin-bottom: 50px;">
+                                       <div dojoType="dijit.layout.ContentPane" orientation="horizontal" style="margin-bottom: 20px;">
 
                                                <button jsId="save_ou_button" dojoType="dijit.form.Button" label="Save">
                                                        <script type="dojo/connect" event="startup">
                                                        </script>
                                                        <script type="dojo/connect" event="onClick">
 
-                                                               var modified_ou = new aou().fromHash( current_ou );
+                                                               var modified_ou = new aou().fromStoreItem( current_ou );
                                                                modified_ou.ischanged( 1 );
-                                                               modified_ou.isnew( ou_list_store.getValue( current_ou, 'isnew' ) );
+
+                                                               pCRUD.request({
+                                                                       method : 'open-ils.permacrud.update.aou',
+                                                                       timeout : 10,
+                                                                       params : [ ses, modified_ou ],
+                                                                       onerror : function (r) {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               throw 'Problem saving data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                       },
+                                                                       oncomplete : function (r) {
+                                                                               var res = r.recv();
+                                                                               if ( res && res.content() ) {
+                                                                                       highlighter.editor_pane.green.play();
+                                                                               } else {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       throw 'Problem saving data for ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                               }
+                                                                       },
+                                                               }).send();
 
                                                        </script>
                                                </button>
                                                        </script>
                                                        <script type="dojo/connect" event="onClick">
 
-                                                               var modified_ou = new aou().fromHash( current_ou );
-                                                               modified_ou.isdeleted( 1 );
+                                                               if ( current_ou.children ) {
+                                                                       var kids = current_ou.children;
+                                                                       if (!dojo.isArray(kids)) kids = [kids];
+
+                                                                       var existing_kids = dojo.filter(
+                                                                               kids,
+                                                                               function(kid){ return kid.isdeleted[0] != 1 }
+                                                                       );
+                                                                       if ( existing_kids.length > 0) {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               alert(existing_kids.length + ' kids still exist');
+                                                                               return;
+                                                                       }
+                                                               }
+
+                                                               if ( confirm('Are you sure you want to delete ' + current_ou.name + '?')) {
+                                                                       ou_list_store.setValue( current_ou, 'isdeleted', 1 );
+
+                                                                       var modified_ou = new aou().fromStoreItem( current_ou );
+                                                                       modified_ou.isdeleted( 1 );
+
+                                                                       pCRUD.request({
+                                                                               method : 'open-ils.permacrud.delete.aou',
+                                                                               timeout : 10,
+                                                                               params : [ ses, modified_ou ],
+                                                                               onerror : function (r) {
+                                                                                       highlighter.editor_pane.red.play();
+                                                                                       throw 'Problem deleting ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                               },
+                                                                               oncomplete : function (r) {
+                                                                                       var res = r.recv();
+                                                                                       if ( res && res.content() ) {
+
+                                                                                               ou_list_store.fetch({
+                                                                                                       query : { id : ou_list_store.getValue( current_ou, 'id' ) },
+                                                                                                       queryOptions : { deep : true },
+                                                                                                       onItem : function (item, req) { try { this.deleteItem( item ); } catch (e) { /* meh */ } },
+                                                                                                       scope : ou_list_store
+                                                                                               });
+
+                                                                                               current_ou = null;
+
+                                                                                               new_kid_button.disabled = true;
+                                                                                               save_ou_button.disabled = true;
+                                                                                               delete_ou_button.disabled = true;
+               
+                                                                                               var main_settings_fields = [ 'name', 'shortname', 'email', 'phone', 'ou_type', 'parent_ou' ];
+                                                                                               for ( var i in main_settings_fields ) {
+                                                                                                       var field = main_settings_fields[i];
+                                                                                                       window["editor_pane_" + field].setValue( '' ); // unset the value
+                                                                                                       window["editor_pane_" + field].setDisplayedValue( '' ); // unset the value
+                                                                                               }
+               
+                                                                                               highlighter.editor_pane.green.play();
+                                                                                       } else {
+                                                                                               highlighter.editor_pane.red.play();
+                                                                                               throw 'Problem deleting ' + ou_list_store.getValue( current_ou, 'name' );
+                                                                                       }
+                                                                               },
+                                                                       }).send();
 
-                                                               ou_list_store.deleteItem( current_ou );
-                                                               current_ou = null;
+                                                               }
 
                                                        </script>
                                                </button>
                                                </script>
                                                <script type="dojo/connect" event="onClick">
 
-                                                       var new_ou = ou_list_store.newItem(
-                                                               { id            : virgin_ou_id--,
-                                                                 isnew         : 1,
-                                                                 parent_ou     : ou_list_store.getValue( current_ou, 'id' ),
+                                                       var new_fm_obj = new aou().fromHash({
+                                                               isnew                   : 1,
+                                                               name                    : 'New Branch',
+                                                               opac_visible    : 'f',
+                                                               shortname               : ou_list_store.getValue( current_ou, 'shortname' ) + '-NEW' + virgin_ou_id--,
+                                                               parent_ou               : ou_list_store.getValue( current_ou, 'id' ),
+                                                               ou_type                 : ou_list_store.getValue( current_ou, 'ou_type' )
+                                                       });
+
+                                                       var new_obj;
+
+                                                       pCRUD.request({
+                                                               method : 'open-ils.permacrud.create.aou',
+                                                               timeout : 10,
+                                                               params : [ ses, new_fm_obj ],
+                                                               onerror : function (r) {
+                                                                       highlighter.editor_pane.red.play();
+                                                                       throw 'Problem creating child Org Unit';
+                                                               },
+                                                               oncomplete : function (r) {
+                                                                       var res = r.recv();
+                                                                       if ( res && res.content() ) {
+                                                                               ou_list_store.newItem(
+                                                                                       res.content().toHash(),
+                                                                                       { parent : current_ou, attribute : 'children' }
+                                                                               );
+                                                                       } else {
+                                                                               highlighter.editor_pane.red.play();
+                                                                               throw 'Problem creating child Org Unit';
+                                                                       }
                                                                },
-                                                               { parent : current_ou, attribute : 'children' }
-                                                       );
+                                                       }).send();
 
-                                                       current_ou = new_ou;
+                                                       highlighter.editor_pane.green.play();
 
                                                </script>
                                        </button>