Tampilkan postingan dengan label jQuery. Tampilkan semua postingan
Tampilkan postingan dengan label jQuery. Tampilkan semua postingan

Kamis, 26 September 2013

Implementasi jQuery Sortable pada APEX Classic Report (AJAX)

Sebelumnya silahkan pelajari UI dokumentasi disini dan demonya disini.
Contoh kasus kita terapkan pada tabel EMP.
Kita bisa lakukan dengan memakai konsep AJAX atau Dynamic Action.

Langkah implementasi dalam APEX untuk AJAX sbb:

  • Tambahkan kolom ORDER_BY number(3);
  • Buatlah report dengan memakai collection contoh nama collection : 'R_SORT'
    1. Buat process pl/sql before header
    2. declare
       l_col_name varchar2(100):='R_SORT';
       l_query varchar2(4000);
      begin
        l_query:='select a.EMPNO,a.ENAME,a.JOB,a.MGR,a.HIREDATE,a.SAL,a.COMM,a.DEPTNO,a.ORDER_BY from emp a order by a.ORDER_BY';
       if not APEX_COLLECTION.COLLECTION_EXISTS(p_collection_name => l_col_name) then
        APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B(
                p_collection_name => l_col_name
              , p_query => l_query
            );
       end if;
      end;
            
    3. Buat calssic report dengan query
    4. SELECT coll.seq_id No
           , coll.c001 empno
           , coll.c002 ename
           , coll.c003 job
           , coll.c004 mgr
           , coll.c005 hiredate
           , coll.c006 comm
           , coll.c007 sal
           , coll.c008 deptno
      FROM APEX_collections coll
      WHERE coll.collection_name = 'R_SORT'
      ORDER BY to_number(coll.seq_id)
          
  • Buatlah Application Process : REORDER dengan process point : on demand
  • declare
      -- ajax call to move a seq_id collection
     l_seq     number(5);
     l_seq_id     number(5); 
     l_old        number(5); 
     l_new        number(5); 
     l_counter    number(5);
     l_abscounter    number(5);
    begin
     l_seq_id    := to_number(wwv_flow.g_x01);
     l_counter   := to_number(wwv_flow.g_x02);
     l_abscounter  :=abs(l_counter);
          if l_counter < 0 then
          -- Move UP
            for i in 1 .. l_abscounter loop
            apex_collection.move_member_down(
                p_collection_name => 'R_SORT'
              , p_seq             => l_seq_id
            );     
              l_seq_id := l_seq_id - 1;
            end loop;
          elsif l_counter > 0 then
          -- Move DOWN
            for i in 1 .. l_abscounter loop
              apex_collection.move_member_up(
                  p_collection_name => 'R_SORT'
                , p_seq             => l_seq_id
              );        
              l_seq_id := l_seq_id + 1;        
            end loop;      
          end if;    
    htp.prn('success');
    end;
      
  • Buatlah sebuah function jQuery untuk setup preparation Sortable dan AJAX memanggil application process REORDER:
  • function setSortable() {
        var vStart = 0;
        var vEnd = 0;
        var vCounter = 0;
        var vSeqId = 0;
        var sortRegion = '#report_RSORT_1 .report-standard tbody:first'; // selector tergantung report yg anda pakai
        $(sortRegion).sortable({
           cursor      : 'wait',
           distance    : 15,
           revert      : 500,
           start       : function (event, ui) {
            vStart = Number(ui.item.index()) + 1;
            vSeqId = Number($(this).find('td[headers="NO"]')[ui.item.index()].innerHTML);},
           stop        : function (event, ui) {
            vEnd = Number(ui.item.index()) + 1;
            vCounter = vEnd - vStart;
            apex.server.process("REORDER"
                  , { x01: vSeqId, x02: vCounter }
                  , {
                      dataType: 'text'
                      , success: function (pData) {
                      if (pData != 'success') {
                               alert(pData);
                       }
                      else {
                         // refresh report id tergantung report yg anda pakai
                        $('#report_28558823308938595811_catch').trigger('apexrefresh');
                      }
            }
           }
        );
        }
       });
       $(sortRegion).disableSelection();
    }
    
  • tambahkan function setup preparation Sortable pada  bagian on load : setSortable();
  • Buatlah DA after refresh pada report sortable execute javascript : setSortable();
Liat demo hasilnya disini.

Rabu, 01 Agustus 2012

Mac Menu / Dock Menu / Fisheye on APEX

Anda bisa mengimplementasikan dari sumber berikut
Ikuti langkah-langkahnya. sebisa mungkin satu folder di pindahkan ke server.
Contoh pemakaian berikut

Sabtu, 28 Juli 2012

Anything Slider jQuery Plugin into APEX

Jika anda ingin mengimplementasikan Anything Slider jQuery Plugin seperti contoh berikut lakukan langkah-langkah berikut :
  1. Download plugin di sini.
  2. Extract hasil download.
  3. Pindahkan folder (css, images, js)ke dalam image server apex
    • Untuk OHS copy paste kedalam /i/myapp/anythingslider/
    • Untuk EPG memalai filezilla atau fireFTP pindah ke /i/myapp/anythingslider/

Implementasi dapat dilakukan dengan dua cara yaitu :
  • Static Image
    1. Pada page header
    2. <link rel="stylesheet" href="/i/myapp/AnythingSlider/css/anythingslider.css">
      <script src="/i/myapp/AnythingSlider/js/jquery.anythingslider.js" type="text/javascript"></script>
          <style>
              #slider { width: 200px; height: 200px; }
              #slider2 { width: 700px; height: 390px; }
          </style>
      
          <!-- AnythingSlider initialization -->
          <script>
              // DOM Ready
              $(function(){
                  $('#slider').anythingSlider();
              });
              $(function(){
                  $('#slider2').anythingSlider();
        });
       </script>
      
    3. Buatlah sebuah HTML region dengan source
    4. <ul id="slider">
      
      <li><img src="/i/apex/graphics/apex_consolidation.png" alt=""></li>
      
      <li><img src="/i/apex/graphics/apex-architecture.png" alt=""></li>
      
      <li><img src="/i/apex/graphics/apex-bip.png" alt=""></li>
      
      <li><img src="/i/apex/graphics/apex-multitenant.png" alt=""></li>
      
      </ul>
      
  • Dynamic image dari tabel (contoh kasus demo_product_info)
    1. Buatlah hidden item : PX_PRODUCT_ID (jangan lupa ganti x dengan page dimana anda buat)
    2. Buatlah sebuah application process on demand:getting_img
    3. DECLARE
        l_lob      BLOB;
        l_length   NUMBER;
        l_mimetype VARCHAR2(2000);
        l_filename VARCHAR2(2000);
      BEGIN
      --
        SELECT product_image,
          mimetype,
          filename
        INTO l_lob,
          l_mimetype,
          l_filename
        FROM demo_product_info
        WHERE product_id = :PX_PRODUCT_ID
        ;
        --
        l_length := DBMS_LOB.getlength(l_lob);
        --
        htp.flush;
        htp.init;
        --
        owa_util.mime_header(nvl(l_mimetype,'application/octet'), FALSE);
       
        htp.p('Content-length:' || l_length);
        htp.p('Content-Disposition:inline;filename="' || l_filename || '"');
        --
        -- close the headers
        owa_util.http_header_close;
        --
        -- download the BLOB
        wpg_docload.download_file(l_lob);
      --
      END;
      
    4. Buatlah sebuah region : PL/SQL anonymous block
    5. DECLARE
      BEGIN
          HTP.prn('<ul id="slider">'); 
       FOR c1 IN(
          SELECT product_id,
            product_name
          FROM demo_product_info
          WHERE NVL(dbms_lob.getlength(product_image),0) > 0
        )LOOP
       
          HTP.prn('<li>');           
          HTP.prn('<div class="clist">');
          HTP.prn('<img src="f?p=&APP_ID.:&APP_PAGE_ID.:&APP_SESSION.:APPLICATION_PROCESS=getting_img:NO::PX_PRODUCT_ID:' || c1.product_id || '" alt="" />');
          HTP.prn('<p>' || c1.product_name || '</p>');
          HTP.prn('</div>');
          HTP.prn('</li>');
       
        END LOOP;
          HTP.prn('</ul>');
      END;
      

Maka akan kita lihat hasil penampakan seperti berikut:
  • Static image
  • Dynamic image

Minggu, 22 Juli 2012

Modal Dialog using iFrame

Kebutuhan tingkat lanjut dalam penggunaan jQuery UI untuk form dialog bisa di penuhi dengan dua cara yaitu.
  • Memakai cara biasa dengan mendefinisikan <div></div> yang ada didalam page tersebut, kemudiann mendefinisikan code jQuery di page tersebut. Tehnik ini memiliki kelemahan jika kita butuh proses yang sama untuk banyak page yang nantinya akan memerlukan code spesifik terhadap page tersebut. bayangkan jika kebutuhan seperti itu ada 10 page?. Anda bisa pelajari dasarnya di sini.
  • Memakai iFrame dalam page 0 (zero) . Tehnik ini memerlukan definisi jS di page zero, dan memodifikasi branching di page form process memakai  : Branch to PL/SQL Procedure.

Detail prosesnya adalah sebagai berikut
  1. Pada page zero buatlah region (Before footer)sbb
  2. <script type="text/javascript">
    function iFrameModal(pHref, pW,pH,pT){
    var vpad=10;
    $( "#iFrameModal:ui-dialog" ).dialog( "destroy" );
    $('<iframe id="iFrameModal"  src="' + pHref + '" />').dialog({
            autoOpen: true,
            title:pT,
            width: pW,
            height: pH,
            modal: true,
            resizable: true
        }).width(pW-vpad).height(pH-vpad); 
    };
    </script>
    
  3. Buatlah page form with report tabel EMP contoh akan memakai page 21 (report) dan 22 (Form)
  4. Pada page 21 (report) lakukan perubahan berikut:
    • Tombol Create ubah menjadi :
    • javascript:iFrameModal('f?p=&APP_ID.:22:&SESSION.::NO:22::',390,435,'Create: EMP');
    • Link Report ubah menjadi :
    • javascript:iFrameModal('f?p=&APP_ID.:22:&APP_SESSION.::::P22_EMPNO:#EMPNO#',600,400,'Edit : EMP');
      
  5. Pada page 22 (Form) lakukan perubahan berikut:
    • Delete atau buat conditional Never untuk existing branching
    • Buatlah branching baru dengan tipe Branch to PL/SQL Procedure :
    • BEGIN
      --closes this popup window
      htp.p('<body>');
      htp.p('<script type="text/javascript">');
      htp.p('parent.doSubmit(''DUMMY'');');
      htp.p('parent.$(''this'').dialog(''close'');');
      htp.p('</script>');
      htp.p('</body>');
      END;
      

Catatan : Page template untuk page 22 (Form) gunakan popup atau modifikasi template printer friendly dengan menghilangkan bagian navbar dan logo.
Contoh demo bisa dilihat di sini.
Sumber : Oracle APEX Forum.

Senin, 16 Juli 2012

Implementasi jQuery UI ke dalam APEX

Pada dasarnya APEX sudah merupakan murni aplikasi web yang sama sekali berbeda dengan Oracle Form developer. Karena itu pengetahuan tentang JS, HTML, CSS akan berpengaruh banyak dalam pengembangannya.

Library jQuery sudah include didalam apex dengan direktory #IMAGE_PREFIX#libraries/ untuk versinya pada APEX terakhir (4.1.1) adalah 1.4.2 dan 1.6.2 sedangkan untuk UI adalah 1.8.

Meskipun APEX sendiri telah memakainya secara internal dengan memanggil fungsi-fungsi tertentu seperti apex.jQuery bisa diganti dengan $. Namun untuk pemakaian yang spesifik seperti UI widget kita harus mendefinisikan terlebih dahulu didalam template, header/footer sebuah page yang akan kita pakai. contoh
  • Theme
  • <link rel="stylesheet" href = "#IMAGE_PREFIX#libraries/jquery-ui/1.8/themes/
    ui-lightness/jquery-ui.css" type="text/css" />
    
  • UI
  • <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/ui/jquery.ui.accordion.js" type="text/javascript"></script>
    <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/ui/jquery.ui.sortable.js"></script>
    
  • Effects
  • <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/ui/jquery.effects.explode.js"></script>
    
  • External Cookie
  • <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/external/jquery.cookie.js" type="text/javascript"> </script>
    
Kita bisa mengimplementasikan contoh demo jQuery UI kedalam APEX. Seperti demo contoh yang saya buat.
Namun implementasi di dalam APEX sebisa mungkin memakai template supaya bisa digunakan berulang-ulang sesuai kebutuhan. Selamat mencoba.

Rabu, 11 Juli 2012

Tiga Cara Highlight Row untuk Classic Report

Untuk melakukan hal ini ada 3 cara.
  1. Melalui CSS.
  2. Melalui cara ini buatlah di bagian header/footer page atau header/footer Region report. Jangan lupa region id diberi nama EMP_REPORT
    #EMP_REPORT .highlight-row:hover > td {
    background-color: red;
    }
    
  3. Melalui JS/jQuery
  4. Cara kedua bisa dilalukan dengan atau tanpa dynamic action yaitu:
    • Event : Page load
    • Action : Execute JavaScript Code
    • Setting :
    • $(this.affectedElements).prepend(
        ''
      );
      
    • Effect : Region (pilih region report yang akan di highlight)
  5. Melalui Template Report
  6. Melalui cara ini kita harus melakukan edit template report yang kita pakai. contoh STANDARD.
    • Before Each Row :
    • <tr #HIGHLIGHT_ROW#>
      
    • After Each Row :
    • </tr>
      
    • Row Highlighting : Background color for current row = red

Jumat, 20 Mei 2011

Implementasi jQueryUI Accordion

Implementasi jQueryUI Accordion pada dasarnya sama dengan ketika implementasi jQueryUI Tabs.
Yang berbeda adalah sbb:

  • Pada bagian template definition :
  • <div id="#REGION_STATIC_ID#" #REGION_ATTRIBUTES#>
    #BODY##SUB_REGION_HEADERS##SUB_REGIONS#
    </div>
    
    <link rel="stylesheet" href = "/i/libraries/jquery-ui/1.8/themes/
    ui-lightness/jquery-ui.css" type="text/css" />
     
    <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/ui/minified/jquery.ui.accordion.min.js" type="text/javascript"></script>
    
    
    
  • tambahkan pula function js untuk menyimpan cookies state (supaya ketika di submit posisi yang terbuka tetap pada section yang sama). Serta memakai icon custom
  •  
    <script type="text/javascript">
    apex.jQuery(function() {
      apex.jQuery("##REGION_STATIC_ID#").accordion({cookie:{expires:1}});
    });
    jQuery(function($) {
        var userpanel = $("##REGION_STATIC_ID#");
        var index = $.cookie("accordion");
        var active;
        if (index !== undefined) {
            active = userpanel.find("h3:eq(" + index + ")");
        }
        userpanel.accordion({
            header: "h3",
            event: "hoverintent",autoHeight: true,animated: 'bounceslide',collapsible: true,fillSpace: false, 
            active: active,
            change: function(event, ui) {
                var index = $(this).find("h3").index ( ui.newHeader[0] );
                $.cookie("accordion", index);
            }
        });
    });
    
    </script> 
    
    <script>
     $(function() {
      var icons = {
       header: "ui-icon-circle-arrow-e",
       headerSelected: "ui-icon-circle-arrow-s"
      };
      $( "##REGION_STATIC_ID#" ).accordion({
       icons: icons
      });
      $( "#toggle" ).button().toggle(function() {
       $( "##REGION_STATIC_ID#" ).accordion( "option", "icons", false );
      }, function() {
       $( "##REGION_STATIC_ID#" ).accordion( "option", "icons", icons );
      });
     });
     </script>
    
  • Pada bagian Sub Region template :
  •  <h3><a href="#">#SUB_REGION_TITLE#</a></h3>
    <div>#SUB_REGION#</div>
    
  • catatan region child yang akan memakai parent jQuery accordion sebaiknya memakai no template.
  • Demo hasil di sini
  • Eksplorasi lebih lanjut silahkan pelajari di sini
Oke sekarang kita lihat hasilnya


source awal : Thanks Patrick Wolf for sharing on oracle forum

Selasa, 12 April 2011

Memakai jQuery Tab

gambar 1
Gambar 2
Oke setelah kita memakai konfirmasi jQuery, maka untuk ekplorasi lebih jauh apex dan jQuery kita akan memakai tab. Pertama disini tab bukan sebuah tabb page seperti yang anda bayangkan dalam template page apex namun sebuah region.

Tab region akan berguna dalam sebuah page yang memuat banyak transasksi atau informasi yang harus ditampilkan dalam satu halaman, menggunkan scroll tidak masalah untuk page berita atau page report, namun untuk page transaksi tentu kurang bagus dalam tampilan.

oke ..untuk membuatnya kita memerlukan prasyarat berikut :
  • Upload file jquery.cookie.js ke dalam static file.
  • Buatlah template region baru seperti berikut:
  1. Nama : terserah contoh (jQueryTab)
  2. Template class : custom1
  3. Definition  (Template) :
  4. #BODY##SUB_REGION_HEADERS##SUB_REGIONS#
    <link rel="stylesheet" href = "/i/libraries/jquery-ui/1.8/themes/ overcast/jquery-ui.css" type="text/css" /> */
  5. Sub Region (Header Template) lihat gambar 1 :
    >#ENTRIES#</ul> 
  6. Sub Region (Header Entry Template) :
  7. #SUB_REGION_TITLE#
  8. Sub Region (Template) :
    #SUB_REGION#




Setelah region jQueryTab terbentuk maka anda kan bisa memakainya sesuai kebutuhan page anda dengan syarat .
  •  Jadikan region tsb sebagai parent
  • Region child harus no template (karena akan di cover oleh region parent-nya).
contoh pemakaian :
Sumber : Oracle Apex Forum (Patrick Wolf thanks for sharing )

Kamis, 07 April 2011

Membuat Konfirmasi jQuery menggantikan standard APEX

Mungkin kita telah tahu standard konfirmasi di apex yang biasanya muncul ketika akan menghapus sebuah transaksi. jika kita lihat button tsb akan memanggil function js berikut :

javascript:apex.confirm(htmldb_delete_message,'MULTI_ROW_DELETE');


dan akan memunculkan sebuah windows konfirmasi. berikut :
standard konfirmasi


Sekarang bagaimana membuat nya lebih baik dengan memakai jQuery karena apex 4 sudah built in dengan jquery. lakukan langkah-langkah berikut:
  • Buat page zero (0).
  • Buatlah region (with no template) pada posisi before footer dengan source berikut :
  • Ubah code standard digantikan dengan function yang baru tersebut.
javascript:confirmSubmit('Anda yakin akan memnghapus biaya ini ?','MULTI_ROW_DELETE'); 

tadaaaa...
 
jQuery konfirmasi
selanjutnya anda tinggal membuat function untuk handle URL.

Sumber : Oracle Apex Forum (Jari Laine thanks for sharing )