Bagaimana kami membuat dukungan widget untuk aplikasi di MyStore

Halo semuanya! MySklad Marketplace sedang mengudara. The terakhir kali kita berbicara tentang bagaimana kami meluncurkan aplikasi marketpleys di SaaS-layanan MoySklad . Hari ini kami akan melanjutkan tentang cara kami mengaktifkan aplikasi untuk memperluas antarmuka pengguna layanan. Mungkin, banyak yang menemukan aplikasi desktop dengan plugin serupa, yang, ketika terhubung, menambahkan beberapa tombol mereka sendiri, item menu dan bahkan seluruh rangkaian jendela dan dialog baru ke aplikasi, dan juga menyematkan blok UI mereka sendiri ke layar yang ada. . Bagaimana Anda melakukan ini di layanan SaaS yang memiliki UI browser?





Mengapa harus menyematkan UI?

Di awal Marketplace untuk aplikasi tujuan umum, satu-satunya cara yang tersedia untuk mengintegrasikan aplikasi dengan MyStore adalah integrasi data melalui API JSON umum . Melalui API ini, backend aplikasi vendor dapat menerima dan mengubah data pengguna. Jadi, pada awalnya, kami hanya memiliki kemampuan untuk mengintegrasikan backend aplikasi dan MyStore satu sama lain. Mereka tidak dapat menambahkan tombol atau widget ke formulir pengeditan aplikasi.





Awalnya, terlihat jelas bahwa ini tidak cukup untuk memberikan pengalaman aplikasi terbaik kepada pengguna akhir. Di sisi lain, pengembang dan integrator eksternal harus mengumpulkan mekanisme mereka di UI - mereka memiliki pilihan untuk menyematkan langsung ke aplikasi web HTML MyStore melalui plugin browser atau membuat antarmuka terpisah (UI) di pihak mereka, sebagian besar. menduplikasi fungsionalitas layar di MyStore (misalnya, daftar dokumen dengan filter).





, β€” , ( ). β€” , , . , () , .





, , UI- β€” must have , .





β€” β€” iframe . , , . . 





UI- -.





.

, , SaaS-.





. UI, .





:





:













  1. ,









:





  • . . , , ( ) UI ( ) (UX).





  • . . , , , β€œβ€ .





  • / . , UI β€” SPA, : DOM- , UI β€” . , .





?

SaaS- (Jira, Salesforce, Zendesk) (amoCRM, 24, InSales). .





:





  1. : SPA - ?





  2. - (- , iframe ), , SDK ( UI)?





  3. , ?





  4. . , / .





. , .





, SPA- β€œβ€ SPA (β€œβ€ β€” , , UI SPA, - β€” ). UI β€” SPA. 





iframe’. :





  1. iframe , ( , β€” ). sandbox iframe’a allow-same-origin



    , DOM - . - , , JavaScript-. ().





  2. iframe ( allow-same-origin



    ) β€” , DOM- - . . - postMessage, , , , JavaScript- - . , postMessage JS SDK β€” JavaScript-.





JS SDK. JS SDK API , API β€œβ€ postMessage JavaScript-.





amoCRM, DOM- -. , , , β€” , UI. , . , , , - .





(, ) β€” JSON- (). XML β€” XML- ( JSON-). XML JSON’a β€” .





XML-

, , :





<ServerApplication xmlns="https://online.moysklad.ru/xml/ns/appstore/app/v2"             
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"             
                    xsi:schemaLocation="https://online.moysklad.ru/xml/ns/appstore/app/v2      
                    https://online.moysklad.ru/xml/ns/appstore/app/v2/application-v2.xsd">
    <iframe>
        <sourceUrl>https://example.com/iframe.html</sourceUrl>
        <expand>true</expand>
    </iframe>
    <vendorApi>
        <endpointBase>https://example.com/dummy-app</endpointBase>
    </vendorApi>
    <access>
        <resource>https://online.moysklad.ru/api/remap/1.2</resource>
        <scope>admin</scope>
    </access>
    <widgets>        
        <entity.counterparty.edit>            
            <sourceUrl>https://example.com/widget.php</sourceUrl>            
            <height>                
                <fixed>150px</fixed>            
            </height>
            <supports>
                <open-feedback/>
                <save-handler/>
            </supports>
            <uses>
                <good-folder-selector/>
            </uses>                  
        </entity.counterparty.edit>    
    </widgets>
    <popups>
        <popup>
            <name>somePopup</name>
            <sourceUrl>https://example.com/popup.php</sourceUrl>
        </popup>
        <popup>
            <name>somePopup2</name>
            <sourceUrl>https://example.com/popup-2.php</sourceUrl>
        </popup>
    </popups>
</ServerApplication>

      
      



, XML, JSON? , XML β€” XML Schema. JSON β€” , JSON Schema. JSON- ( XML-) , , IDE. , JSON- . , XML- . JSON-, , XML JSON , XML- .





? :





  1. , . , , , - . β€” .





  2. code completion IDE β€œ ” UI . - ( ), .





, , Intellij IDEA , :





IDE open-feedback ( - ):





:





.





XML-

( ) . , ( ) . β€” . , . , . . . .   





. , . , β€” , , , , , , - . , , - , . .





, XML-:





<widgets>
    <some.extension.point1>...</some.extension.point1>
    <some.extension.point2>...</some.extension.point2>
</widgets>
      
      



, , :





<widgets>
    <widget location="some.extension.point1">...</widget>
    <widget location="some.extension.point2">...</widget>
</widgets>
      
      



XML- (β€œβ€) . - β€œβ€ β€” . , XML-, XML-.





? , , ?





:





<document.customerorder.edit>
    <sourceUrl>https://example.com/widget.php</sourceUrl>
    <height>
        <fixed>150px</fixed>
    </height>
    <supports>...</supports>
    <uses>...</uses>
</document.customerorder.edit>
      
      



sourceUrl



height



. sourceUrl



iframe, height



( , β€” , , UI).





( ) - (, , ), , <height><dynamic/></height>



. β€” . , , <dynamic/>



, . 





supports



uses



. .





( API , ):





:





<document.customerorder.edit>
    <sourceUrl>https://example.com/widget.php</sourceUrl>
    <height>
        <fixed>150px</fixed>
    </height>
    <supports>
        <open-feedback/>
        <save-handler/>
        <change-handler>
            <expand>agent</expand>
            <expand>positions.assortment</expand>
        </change-handler>
    </supports>
    <uses>
        <good-folder-selector/>
    </uses>
</document.customerorder.edit>
      
      



.





β€” , UI , . , HTTP postMesssage. .





.





β€” , / ( ). . , sourceUrl



height



, iframe HTTP - postMessage- Open



.





DOM- :





Open



:





{
  "name": "Open",
  "messageId": 12345,
  "extensionPoint": "entity.counterparty.edit",
  "objectId": "8e9512f3-111b-11ea-0a80-02a2000a3c9c",
  "displayMode": "expanded"
}
      
      



β€” ( ) , . supports



( ). .





supports



. .





pen-feedback



( ) β€” , , , OpenFeedback



. , . - , .





:





OpenFeedback



:





{
  "name": "OpenFeedback",
  "correlationId": 12345
}  
      
      



save-handler



( ) β€” , - β€œβ€ Save



.





Save



:





{
  "name": "Save",
  "messageId": 32109,
  "extensionPoint": "entity.counterparty.edit",
  "objectId": "8e9512f3-111b-11ea-0a80-02a2000a3c9c"
}
      
      



hange-handler



( ) β€” , , , ( ). , change-handler



, - β€œβ€ β€” - (, ) - Change



JSON . expand



, JSON API ( change-handler



expand



).





β€” , - . . uses ( ). , -> - -.





β€” good-folder-selector



. . :





1. - SelectGoodFolderRequest



(, - ):





{
  "name": "SelectGoodFolderRequest",
  "messageId": 12345
}
      
      



2. - :





3. - SelectGoodFolderResponse



:





{
  "name": "SelectGoodFolderResponse",
  "correlationId": 12345,
  "selected": true,
  "goodFolderId": "8e9512f3-111b-11ea-0a80-02a2000a3c9c"
}
      
      



:





  1. , .





  2. XML- , ( ). 





  3. / , . : , , - , , , .





  4. , -. , change-handler, - , ( SPA- ).





(, - Init postMessage, iframe. , , ( ), (, ). , , β€” , - , ( ). , .





. .





?

?





. - , . - . . iframe, . postMessage- -. .





change-handler



. β€” update



, -.





:





  • β€œβ€ postMessage JavaScript/TypeScript Widget SDK









  • UI- ( ) β€” , :





    • ,

























  • UI





  • RESP API Widget SDK





UI β€” SaaS- , .





β€” email- , , .





SaaS- β€” β€” , .








All Articles