diff --git a/app/Http/Controllers/SitemapController.php b/app/Http/Controllers/SitemapController.php index f77a364..b549e67 100644 --- a/app/Http/Controllers/SitemapController.php +++ b/app/Http/Controllers/SitemapController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use Spatie\Sitemap\Sitemap; use Spatie\Sitemap\Tags\Url; +use App\Models\Template; class SitemapController extends Controller { @@ -20,6 +21,7 @@ class SitemapController extends Controller ['/login', 0.4], ['/register', 0.4], ['/password/reset', 0.3], + ['/templates', 0.9], ]; public function getSitemap(Request $request) @@ -28,6 +30,7 @@ class SitemapController extends Controller foreach ($this->urls as $url) { $sitemap->add($this->createUrl($url[0], $url[1])); } + $this->addTemplatesUrls($sitemap); return $sitemap->toResponse($request); } @@ -36,4 +39,13 @@ class SitemapController extends Controller { return Url::create($url)->setPriority($priority)->setChangeFrequency($frequency); } + + private function addTemplatesUrls(Sitemap $sitemap) + { + Template::chunk(100, function ($templates) use ($sitemap) { + foreach ($templates as $template) { + $sitemap->add($this->createUrl('/templates/' . $template->slug, 0.7)); + } + }); + } } diff --git a/app/Http/Controllers/TemplateController.php b/app/Http/Controllers/TemplateController.php new file mode 100644 index 0000000..35190cd --- /dev/null +++ b/app/Http/Controllers/TemplateController.php @@ -0,0 +1,32 @@ +middleware('admin'); + + // Create template + $template = $request->getTemplate(); + $template->save(); + + return $this->success([ + 'message' => 'Template created.', + 'template_id' => $template->id + ]); + } + +} diff --git a/app/Http/Requests/Templates/CreateTemplateRequest.php b/app/Http/Requests/Templates/CreateTemplateRequest.php new file mode 100644 index 0000000..43e2acc --- /dev/null +++ b/app/Http/Requests/Templates/CreateTemplateRequest.php @@ -0,0 +1,45 @@ + + */ + public function rules() + { + return [ + 'form' => 'required|array', + 'name' => 'required|string|max:60', + 'slug' => 'required|string|unique:templates', + 'description' => 'required|string|max:2000', + 'image_url' => 'required|string', + 'questions' => 'array', + ]; + } + + public function getTemplate() : Template + { + $structure = $this->form; + $ignoreKeys = ['id','creator','creator_id','created_at','updated_at','extra','workspace','submissions','submissions_count','views','views_count']; + foreach($structure as $key=>$val){ + if(in_array($key, $ignoreKeys)){ + $structure[$key] = null; + } + } + return new Template([ + 'name' => $this->name, + 'slug' => $this->slug, + 'description' => $this->description, + 'image_url' => $this->image_url, + 'structure' => $structure, + 'questions' => $this->questions ?? [] + ]); + } +} diff --git a/app/Models/Template.php b/app/Models/Template.php new file mode 100644 index 0000000..cbf541b --- /dev/null +++ b/app/Models/Template.php @@ -0,0 +1,32 @@ + 'array', + 'questions' => 'array', + ]; + + public function setDescriptionAttribute($value) + { + // Strip out unwanted html + $this->attributes['description'] = Purify::clean($value); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index cc2b603..436cb87 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -18,8 +18,6 @@ class User extends Authenticatable implements JWTSubject //, MustVerifyEmail { use Notifiable, HasFactory, Billable; - const ADMINS = ['julien@notionforms.io']; - /** * The attributes that are mass assignable. * @@ -98,7 +96,7 @@ class User extends Authenticatable implements JWTSubject //, MustVerifyEmail public function getAdminAttribute() { - return in_array($this->email, self::ADMINS); + return in_array($this->email, config('services.admin_emails')); } /** diff --git a/config/services.php b/config/services.php index eaa8e0d..52c3257 100644 --- a/config/services.php +++ b/config/services.php @@ -50,5 +50,7 @@ return [ 'google_analytics_code' => env('GOOGLE_ANALYTICS_CODE'), 'amplitude_code' => env('AMPLITUDE_CODE'), - 'crisp_website_id' => env('CRISP_WEBSITE_ID') + 'crisp_website_id' => env('CRISP_WEBSITE_ID'), + + 'admin_emails' => explode(",", env('ADMIN_EMAILS') ?? '') ]; diff --git a/database/migrations/2022_09_22_092205_create_templates_table.php b/database/migrations/2022_09_22_092205_create_templates_table.php new file mode 100644 index 0000000..4642c58 --- /dev/null +++ b/database/migrations/2022_09_22_092205_create_templates_table.php @@ -0,0 +1,36 @@ +id(); + $table->timestamps(); + $table->string('name'); + $table->string('slug'); + $table->text('description'); + $table->string('image_url'); + $table->jsonb('structure')->default('{}'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('templates'); + } +}; diff --git a/database/migrations/2022_09_26_084721_add_questions_to_templates.php b/database/migrations/2022_09_26_084721_add_questions_to_templates.php new file mode 100644 index 0000000..449fe40 --- /dev/null +++ b/database/migrations/2022_09_26_084721_add_questions_to_templates.php @@ -0,0 +1,32 @@ +jsonb('questions')->default('{}'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('templates', function (Blueprint $table) { + $table->dropColumn('questions'); + }); + } +}; diff --git a/resources/js/components/open/forms/components/FormFieldsEditor.vue b/resources/js/components/open/forms/components/FormFieldsEditor.vue index d4ddc35..d3db48c 100644 --- a/resources/js/components/open/forms/components/FormFieldsEditor.vue +++ b/resources/js/components/open/forms/components/FormFieldsEditor.vue @@ -224,7 +224,7 @@ export default { }, init() { if (this.$route.name === 'forms.create') { // Set Default fields - this.formFields = this.getDefaultFields() + this.formFields = (this.form.properties.length > 0) ? clonedeep(this.form.properties): this.getDefaultFields() } else { this.formFields = clonedeep(this.form.properties).map((field) => { // Add more field properties diff --git a/resources/js/components/open/forms/components/FormSubmissions.vue b/resources/js/components/open/forms/components/FormSubmissions.vue index 7837100..5bb97ef 100644 --- a/resources/js/components/open/forms/components/FormSubmissions.vue +++ b/resources/js/components/open/forms/components/FormSubmissions.vue @@ -53,7 +53,6 @@ export default { }, watch: { form () { - debugger if(!this.form){ return } diff --git a/resources/js/components/pages/OpenFormFooter.vue b/resources/js/components/pages/OpenFormFooter.vue index 8c836ae..213413b 100644 --- a/resources/js/components/pages/OpenFormFooter.vue +++ b/resources/js/components/pages/OpenFormFooter.vue @@ -21,6 +21,13 @@ +
+ No any templates found. +
++ {{ formatCreatedDate(template.created_at) }}
+{{ template.name }}
+