From 7093ce56470dd79f74d9cb577684a9d43e40d16f Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Wed, 12 Oct 2016 18:57:14 -0700 Subject: [PATCH] initial implementation --- .../section/airtable/type-editor.js | 39 +++++++++++ .../section/airtable/type-renderer.js | 14 ++++ app/app/styles/print.scss | 2 +- .../section/airtable/type-editor.hbs | 15 +++++ .../section/airtable/type-renderer.hbs | 3 + .../components/section/gemini/type-editor.hbs | 8 +-- app/public/sections/airtable.png | Bin 0 -> 2827 bytes app/public/sections/airtable@2x.png | Bin 0 -> 6741 bytes core/section/airtable/airtable.go | 62 ++++++++++++++++++ core/section/register.go | 4 +- 10 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 app/app/components/section/airtable/type-editor.js create mode 100644 app/app/components/section/airtable/type-renderer.js create mode 100644 app/app/templates/components/section/airtable/type-editor.hbs create mode 100644 app/app/templates/components/section/airtable/type-renderer.hbs create mode 100644 app/public/sections/airtable.png create mode 100644 app/public/sections/airtable@2x.png create mode 100644 core/section/airtable/airtable.go diff --git a/app/app/components/section/airtable/type-editor.js b/app/app/components/section/airtable/type-editor.js new file mode 100644 index 00000000..9c332333 --- /dev/null +++ b/app/app/components/section/airtable/type-editor.js @@ -0,0 +1,39 @@ +// Copyright 2016 Documize Inc. . All rights reserved. +// +// This software (Documize Community Edition) is licensed under +// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html +// +// You can operate outside the AGPL restrictions by purchasing +// Documize Enterprise Edition and obtaining a commercial license +// by contacting . +// +// https://documize.com + +import Ember from 'ember'; + +export default Ember.Component.extend({ + data: "", + + didReceiveAttrs() { + this.set("data", this.get("meta.rawBody")); + }, + + actions: { + isDirty() { + return this.get('meta.rawBody') !== this.get('data'); + }, + + onCancel() { + this.attrs.onCancel(); + }, + + onAction(title) { + let page = this.get('page'); + let meta = this.get('meta'); + page.set('title', title); + meta.set('rawBody', this.get("data")); + + this.attrs.onAction(page, meta); + } + } +}); diff --git a/app/app/components/section/airtable/type-renderer.js b/app/app/components/section/airtable/type-renderer.js new file mode 100644 index 00000000..a5417462 --- /dev/null +++ b/app/app/components/section/airtable/type-renderer.js @@ -0,0 +1,14 @@ +// Copyright 2016 Documize Inc. . All rights reserved. +// +// This software (Documize Community Edition) is licensed under +// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html +// +// You can operate outside the AGPL restrictions by purchasing +// Documize Enterprise Edition and obtaining a commercial license +// by contacting . +// +// https://documize.com + +import Ember from 'ember'; + +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/styles/print.scss b/app/app/styles/print.scss index 48c8a469..fe484f00 100644 --- a/app/app/styles/print.scss +++ b/app/app/styles/print.scss @@ -19,7 +19,7 @@ display: none !important; } - .print-title, .non-printable-message{ + .print-title, .non-printable-message { display: block !important; } } diff --git a/app/app/templates/components/section/airtable/type-editor.hbs b/app/app/templates/components/section/airtable/type-editor.hbs new file mode 100644 index 00000000..7f9c9bec --- /dev/null +++ b/app/app/templates/components/section/airtable/type-editor.hbs @@ -0,0 +1,15 @@ +{{#section/base-editor document=document folder=folder page=page isDirty=(action 'isDirty') onCancel=(action 'onCancel') + onAction=(action 'onAction')}} +
+
+
+
Airtable
+
Paste the Airtable embed code snippet
+
+
+ + {{textarea value=data rows="3" id="airtable-embed-code" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"}} +
+
+
+{{/section/base-editor}} diff --git a/app/app/templates/components/section/airtable/type-renderer.hbs b/app/app/templates/components/section/airtable/type-renderer.hbs new file mode 100644 index 00000000..24600468 --- /dev/null +++ b/app/app/templates/components/section/airtable/type-renderer.hbs @@ -0,0 +1,3 @@ +
+ {{{page.body}}} +
diff --git a/app/app/templates/components/section/gemini/type-editor.hbs b/app/app/templates/components/section/gemini/type-editor.hbs index 3cfb085d..99c0068d 100644 --- a/app/app/templates/components/section/gemini/type-editor.hbs +++ b/app/app/templates/components/section/gemini/type-editor.hbs @@ -1,6 +1,6 @@ {{#section/base-editor document=document folder=folder page=page busy=waiting tip="Gemini enterprise issue and ticketing software (https://www.countersoft.com)" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} -
+
@@ -25,9 +25,9 @@
Authenticate
-
+
-
+
{{#if authenticated}}
@@ -49,6 +49,6 @@
{{/if}} -
+
{{/section/base-editor}} diff --git a/app/public/sections/airtable.png b/app/public/sections/airtable.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed906e234d55b298fd92d5b2b9c9b809071c95b GIT binary patch literal 2827 zcmbVOXIN8b8&1R^OOPeX&@^b7nUD!7kO2k=B14w8gd{+K43jVmiflm<1q}#TT&Pf) z4g^I;1W~49Dk30dh}D9qAj9zmEB(G7z53%j*E#2X-{(B{{p{;Hhuqzq)~o2N004mX zv>g-=`D(iIC@IR{hd7%Muk7_LB$1^{gBVgw9kI9m)3Vux^eM956T9SE4iB0_x7bOc>M zW`}Zi#0lA+ac*ABxNs((1+n`9Y#T$66L8sL1~`Tr!4nZ;h>)+m1o?hN42OWfs))mh zkiVSrrMrX4d?6c*hGC#gq!kK`#lw(jJPK!R2}U817&yWjj>JQeRs{KNjR1eUAaZL$ zRxrVX;`q&${6vI=ip2r~93CAV4U4vd@r5CBEFKR>px`JJRIULP#qz|A7${FvFhJbUqD{+0*7KuIB z|8?UZwMAaB0yf-(E#gNCneuuB8?S=px%+oRD~fV&2s?!wc~KY<6h1SO%jSt`6e2|a z1;*mA2q*>$jbH|$p(s`m8)}U~GocJT4hyvk#-kW`D;9$lj9KORC%hxp0p~z;E^OW8INe3?7rcYMUds{S8a`S1f@nWHZEkp%f!)qhV;UDV@RO@K(fTE2a7?atd3>iDI)Hg?ujfYpw~LfA9krj9?&f z2s9Ll55hvN*%&mG!NRhjj9@$thiBpt!N_39H$3bA%^_Uw6nv#&{-=RfMe?p(+5SBa z^26T)#pcPUNGKl{1sA$}cGsEEC=OmRPsjbjLk+!kK2I0_7952ga&kR&H7sDzpK9$D zp7nI81S*sDN=>dnKtCunjfOXZU%=t9QRu&hg0xM8lC z!Y?aI^#!=j ze1~3%)UYuo{N%Bm;TJ`qCrURW0|VCP^l1dHO9q|Ol@OMlD32>tJfr5p(kZm1kEN_*Tj$+8&vf~acan> z!=n1-qr*2`=k@Z^hm#%E%*~OL^^ZUkvvJu{9|>S!d~5!U(eBYhp3l$W=^G08;CJmAwwV@M$>Jdw(i>89?M}Dcn%H99&JL2hVvZ8<*pHix z65Nk}vc6J#*~T_ecSJAy%OShrfn;e~KwrXOSzsm|xnLH{g0tpr1SWL*F+pD43`~gs zz`FZKQ;j_?N!3*S0^eeNz&JoFQ`V?X0FvLU^QT9~^EKSqIWVhRRom1&ca;T}1BUL_ zz;7SS?I9jH5cFWfj|s%MEmPzdviGb3rZ*NpoacU}fVD8u5B8>pJE&WQv zHomrv4N9>;?qXcNA$x>Q;g&8B4flTx|)9bwi7VVlE!Z*O!*H6u zU`!xgyRG^{!kv+-X$Uq!iw&Rcw4_-A(tHyOkB!t&?)C6gQ;+Dy@~WQ`M=dq?>QV zHxo%wN&U8J82%PQv~BW((@)ag{0?f2QQDCdRCgq$@@Ce(FjC?54z`t|FPZq^@C#Fq zA6yPkG^eHQgY>C0+mn447LuoKjXov3x;fZ|7_Dr+IPi&Nu$yK&L|h0xr4^~Tv6?j< zuXcNIx$nAI^VGGqxft0t9)`F#q7-l;{I<(4sytlkLsRx6U6&HOMFi>ShN{!kv^FV= z8j?SdR!eNZ6shQk(aC!25td=@x#i=jiQdx*T9fm@l;eMTk`sUVxm9GyC`ELH)r{yQ zTINqh-AVljzIx(@@%t7)XS!lZ;iOkjXX2KqjS^X`gkCmqWy)-jeX z`SR``Wyw>eHl`P^p^M@MUXSgOc^dmo`0VDkzEuZWD37x?zdEO-s&*~5AreR`Z*ZH; znzHk6!WBe0%(tGl`%oS4}h z*5#oN_B=AjU%gkeQPqia=ge7q-)mLoEq#*SYO{)SCjCWvyNyGlkiaxFXpe7( zr*b{N(d{s`icqS^Ux+{XOg#?^;XE!(Ey$R^7y&fupP9S*xW3n}waQP{xbe=`JO_=( z^^#!dfluEn6%EeaxIg{nfq^VbwYQ*k!BFq{G+yQ5GFEzEjT*pdkLslI7Km)+_moC; Kqg0Rrll}t^UAPVa literal 0 HcmV?d00001 diff --git a/app/public/sections/airtable@2x.png b/app/public/sections/airtable@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..806c11b4c15ad3815f6fd611b8cfff9536760d42 GIT binary patch literal 6741 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. All rights reserved. +// +// This software (Documize Community Edition) is licensed under +// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html +// +// You can operate outside the AGPL restrictions by purchasing +// Documize Enterprise Edition and obtaining a commercial license +// by contacting . +// +// https://documize.com + +package airtable + +import ( + "net/http" + + "github.com/documize/community/core/section/provider" +) + +// Provider represents Airtable +type Provider struct { +} + +// Meta describes us +func (*Provider) Meta() provider.TypeMeta { + section := provider.TypeMeta{} + + section.ID = "3cfa411e-73bf-474c-841a-effd6b00fdd8" + section.Title = "Airtable" + section.Description = "Databases, tables, views" + section.ContentType = "airtable" + + return section +} + +// Command stub. +func (*Provider) Command(ctx *provider.Context, w http.ResponseWriter, r *http.Request) { + provider.WriteEmpty(w) +} + +// Render converts markdown data into HTML suitable for browser rendering. +func (*Provider) Render(ctx *provider.Context, config, data string) string { + return embed(config, data) +} + +// Refresh just sends back data as-is. +func (*Provider) Refresh(ctx *provider.Context, config, data string) string { + return embed(config, data) +} + +func embed(config, data string) string { + return data + // return ` + // + // ` +} diff --git a/core/section/register.go b/core/section/register.go index 005056bd..c6dded39 100644 --- a/core/section/register.go +++ b/core/section/register.go @@ -14,6 +14,8 @@ package section import ( "fmt" + "github.com/documize/community/core/log" + "github.com/documize/community/core/section/airtable" "github.com/documize/community/core/section/code" "github.com/documize/community/core/section/gemini" "github.com/documize/community/core/section/github" @@ -23,7 +25,6 @@ import ( "github.com/documize/community/core/section/table" "github.com/documize/community/core/section/trello" "github.com/documize/community/core/section/wysiwyg" - "github.com/documize/community/core/log" ) // Register sections @@ -36,6 +37,7 @@ func Register() { provider.Register("table", &table.Provider{}) provider.Register("trello", &trello.Provider{}) provider.Register("wysiwyg", &wysiwyg.Provider{}) + provider.Register("airtable", &airtable.Provider{}) p := provider.List() log.Info(fmt.Sprintf("Documize registered %d smart sections", len(p))) }