Kisi Kisi Teknik Desain Laman
Kisi Kisi Teknik Desain Laman
Kisi Kisi Teknik Desain Laman
MODULE SPEEDTEST
Contents
1. MODULE_SPEEDTEST.docx
2. MODULE_SPEEDTEST_MEDIA.zip
Make a line chart from the given data provided in media files. The canvas should be
600x400 in size and centered both vertically and horizontally in the browser. The
vertical label, horizontal label, and the line should exist within the screen.
C3. Scope
You need to make a hidden fullscreen-sized text, and a box of 400x400 on top of it.
The user can not see the text, but they can see it through the box. The box can be
moved by users by dragging it. See example.mp4 for more details.
D1. Internationalization
Provided a json file of languages, you need to translate the words that exist in the
HTML file using PHP. There is a select form where user can change the language of
the website.
Example:
D3. Watermark
Given an image and a logo (png file), the web should output an image with a
watermark in the top right.
CMS MODULE
CONTENTS
This module has the following files:
1. MODULE_CMS.doc
2. MODULE_CMS_MEDIA.zip
Introduction
In 2022, most of the people will prefer to watch movies online instead of going to the
cinema. Stream movies online provide many benefits to the user and the streaming
service. It is cheap and accessible cross-platform without having to worry about the
subscription price.
You are a freelancer working in the field of Web Technologies and you have been
asked to develop the brand-new website for anime streaming website called “Animer”.
Your client has heard that you are good at building a content management system.
They want a theme called “AnimerV1”
Also the login page should not include any “wp” wordings for whitee background
should be a fullscree-label and security reasons. Please make the backend admin URL
as following: <host>/admeen/
Menus
This menu should appear on every page. The client wants to be able to change the
menu dynamically via the admin page.
● Home
● Anime List
● Genres (dropdown genre list)
● Season (dropdown season list)
● Articles
Dashboard Configuration
For simplicity, the client wants to show only some widgets in the dashboard page.
Consist of Glance, Activity, Quick Draft.
Anime Genre
- Action
- Comedy
- Sport
- Romance
Anime Season
- Winter 2022
- Summer 2022
- Spring 2022
- Fall 2022
- Winter 2023
Users can select multiple genres and seasons in an anime.
Anime Functionality
In the all anime page, users can choose to sort the anime by view count or anime title,
or release date. Users can also choose to filter by the season or genres.
The anime detail page should display title, synopsys, release date, average rating,
number of episodes, link to every episode, and a collection of photos (gallery) of the
current anime. Admin or editor can display the gallery via shortcode [anime-gallery
id=GALLERY_ID]. View count will be incremented every page visit on an anime detail
page.
Users can give their own rating by clicking one of the five stars. You need to create
the rating functionality.
Episode Functionality
In every episode of anime, there must be an input for a YouTube video link for the
admin to fill. In the episode page, the link should be transformed to an embedded video
that the user can play. A link to go back to the anime detail page should exist.
Front-end Requirement
You will need to create your own theme, based on the given starter themes. You will
need to implement the following elements for your web page:
● A footer with copyrights and social media links
o “Copyright © 2022 - All rights reserved” where the year should be the
current year dynamically based on server time.
o 3 social media links. Users are able to change the links for each of the
social links.
Feel free to add and change as many elements as you like, but the elements in the list
need to be present and your design should blend in with the given design.
Introduction
Your company “Formify Inc.” points you as a Web Developer to build a website which
is possible for users to create form dynamically according to the question types such
as short answer, paragraph, date input, multiple choice, dropdown and checkboxes.
Users who created the form can share the form link to the user to submit a response
of the form and also see all of the responses.
Description of Projects
There are 2 phases in this module. In the first phase, you will make the RESTFul API
using Laravel Frameworks according to the provided documentation. In the second
phase, you should build a frontend with the Interactive Maps using one of the provided
Javascript Frameworks (React/Vue/Angular) and the data must come from the created
RESTFul API.
You can find the provided media files to support your work:
- Postman collection and environment
- Api tests (to testing your endpoints automatically)
- Template GUI (to build frontend UI)
- Formify.sql (a database with structures and dummy data)
1. Authentication
You should create Login and Logout endpoints. The accessToken must be
generated by sanctum and will be placed in the request headers
Authorization Bearer.
Login
Endpoint : [DOMAIN]/api/v1/auth/login
Method : POST
Validation : email:
- required
- valid email address
password:
- required
- min 5 chars
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Login success",
"user": {
"name": "User 1",
"email": "user1@webtech.id",
"accessToken":
"1|QnHFgF0C7ml2LkbDG5QDn34qvJoYGdpxoXy63Poi"
}
}
If invalid field:
Headers:
- Response status: 422
Body (JSON):
{
"message": "Invalid field",
"errors": {
"email": [
"The email must be a valid email address."
],
"password": [
"The password field is required."
]
}
}
If failed:
Headers:
- Response status: 401
Body (JSON):
{
"message": "Email or password incorrect"
}
Logout
Endpoint : [DOMAIN]/api/v1/auth/logout
Method : POST
Request : Headers:
- Authorization: “Bearer <accessToken>”
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Logout success"
}
If invalid token:
Headers:
- Response status: 401
Body (JSON):
{
"message": "Unauthenticated."
}
2. Form
Users can manage (create, see all created forms, and see detail form) with
questions to share to invited users based on email domain to submit.
Create a Form
Endpoint : [DOMAIN]/api/v1/forms
Method : POST
Request : Headers:
- Authorization: “Bearer <accessToken>”
Body (JSON):
{
"name": "Stacks of Web Tech Members",
"slug": "member-stacks",
"allowed_domains": [ "webtech.id" ],
"description": "To collect all of favorite stacks",
"limit_one_response": true
}
Validation : name:
- required
slug:
- required
- unique
- alphanumeric with special characters only dash “-”
and dot “.” and without space
allowed_domains:
- array
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Create form success",
"form": {
"name": "Stacks of Web Tech Members",
"slug": "member-stacks",
"description": "To collect all of favorite..",
"limit_one_response": true,
"creator_id": 1,
"id": 3
}
If invalid field:
Headers:
- Response status: 422
Body (JSON):
{
"message": "Invalid field",
"errors": {
"name": [
"The name field is required."
],
"slug": [
"The slug has already been taken."
],
"allowed_domains": [
"The allowed domains must be an array."
]
}
}
If invalid token:
Headers:
- Response status: 401
Body (JSON)
{
"message": "Unauthenticated."
}
Method : GET
Request : Headers:
- Authorization: “Bearer <accessToken>”
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Get all forms success",
"forms": [
{
"id": 1,
"name": "Biodata - Web Tech Members",
"slug": "biodata",
"description": "To save web tech membe..",
"limit_one_response": 1,
"creator_id": 1
},
{
"id": 2,
"name": "HTML and CSS Skills - Quiz",
"slug": "htmlcss-quiz",
"description": "Fundamental web tests",
"limit_one_response": 1,
"creator_id": 1
},
{
"id": 3,
"name": "Stacks of Web Tech Members",
"slug": "member-stacks",
"description": "To collect all of favorit..",
"limit_one_response": 1,
"creator_id": 1
}
]
}
If invalid token:
Headers:
- Response status: 401
Body (JSON):
{
"message": "Unauthenticated."
}
Detail Form
Endpoint : [DOMAIN]/api/v1/forms/<form_slug>
Method : GET
Request : -
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Get form success",
"form": {
"id": 1,
"name": "Biodata - Web Tech Members",
"slug": "biodata",
"description": "To save web tech members data",
"limit_one_response": 1,
"creator_id": 1,
"allowed_domains": [
"webtech.id"
],
"questions": [
{
"id": 1,
"form_id": 1,
"name": "Name",
"choice_type": "short answer",
"choices": null,
"is_required": 1
},
{
"id": 2,
"form_id": 1,
"name": "Address",
"choice_type": "paragraph",
"choices": null,
"is_required": 0
},
{
"id": 3,
"form_id": 1,
"name": "Born Date",
"choice_type": "date",
"choices": null,
"is_required": 1
},
{
"id": 4,
"form_id": 1,
"name": "Sex",
"choice_type": "multiple choice",
"choices": "Male,Female",
"is_required": 1
}
]
}
}
Body (JSON):
{
"message": "Form not found"
}
Body (JSON):
{
"message": "Forbidden access"
}
If invalid token:
Headers:
- Response status: 401
Body (JSON):
{
"message": "Unauthenticated."
}
3. Question
Users can manage questions (add and remove) from one of their created forms.
Choices field must be required if the user selects multiple choice, dropdown, or
checkboxes. There are 6 choice types:
1. Short answer (TextField)
2. Paragraph (TextArea)
3. Date (Input Date)
4. Multiple Choice (Radio) : with choices
5. Dropdown (Select) : with choices
6. Checkboxes (Checkboxes) : with choices
Add a Question
Endpoint : [DOMAIN]/api/v1/forms/<form_slug>/questions
Method : POST
Request : Headers:
- Authorization: “Bearer <accessToken>”
Body (JSON):
{
"name": "Most Favorite JS Framework",
"choice_type": "multiple choice",
"choices": [
"React JS",
"Vue JS",
"Angular JS",
"Svelte"
],
"is_required": true
}
Validation : name:
- required
choice_type:
- required
- only: “short answer”, “paragraph”, “date”,
“multiple choice”, “dropdown”, or “checkboxes”
choices
- required if selected choice type is “multiple
choice”, “dropdown”, or “checkboxes”
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Add question success",
"question": {
"name": "Most Favorite JS Framework",
"choice_type": "multiple choice",
"is_required": true,
"choices": "React JS,Vue JS,Angular JS,Svelte",
"form_id": 3,
"id": 10
}
}
If invalid field:
Headers:
- Response status: 422
Body (JSON):
{
"message": "Invalid field",
"errors": {
"name": [
"The name field is required."
],
"choice_type": [
"The choice type field is required."
],
"choices": [
"The choices must be an array.",
"The choices must be a string."
]
}
}
Body (JSON):
{
"message": "Form not found"
}
Body (JSON):
{
"message": "Forbidden access"
}
If invalid token:
Headers:
- Response status: 401
Body (JSON):
{
"message": "Unauthenticated."
}
Remove a Question
Endpoint : [DOMAIN]/api/v1/forms/<form_slug>/questions/<question_id>
Method : DELETE
Request : Headers:
- Authorization: “Bearer <accessToken>”
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Remove question success"
}
Body (JSON):
{
"message": "Form not found"
}
Body (JSON):
{
"message": "Question not found"
}
Body (JSON):
{
"message": "Forbidden access"
}
If invalid token:
Headers:
- Response status: 401
Body (JSON):
{
"message": "Unauthenticated."
}
4. Response
If the creator form sets the form with limit 1 response, then the invited user can’t
submit a response twice. Submit Response only can be accessed by users with
an allowed domain of the user email. If the creator form does not fill allowed
domains, it means that the form can be accessed by anyone/public.
For example:
An user with email “user3@worldskills.org” can’t submit a response to the form
with allowed domains webtech.id and inaskills.id, because worldskills.org can't
be allowed to access the form.
Submit Response
Endpoint : [DOMAIN]/api/v1/forms/<form_slug>/responses
Method : POST
Request : Headers:
- Authorization: “Bearer <accessToken>”
Body (JSON):
{
"answers": [
{
"question_id": 1,
"value": "Ica Amalia"
},
{
"question_id": 2,
"value": "Bandung"
},
{
"question_id": 3,
"value": "2006-08-01"
},
{
"question_id": 4,
"value": "Female"
}
]
}
Validation : answers
- array
[question value]
- required if sets true
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
"message": "Submit response success"
}
If invalid field:
Headers:
- Response status: 422
Body (JSON):
{
"message": "Invalid field",
"errors": {
"answers": [
"The answers field is required."
]
}
Body (JSON):
{
"message": "Forbidden access"
}
Body (JSON):
{
"message": "You can not submit form twice"
}
If invalid token
Headers:
- Response status: 401
Body (JSON):
{
"message": "Unauthenticated."
}
Method : GET
Request : Headers:
- Authorization: “Bearer <accessToken>”
Response : If success:
Headers:
- Response status: 200
Body (JSON):
{
Body (JSON):
{
"message": "Form not found"
}
Body (JSON)
{
"message": "Forbidden access"
}
If invalid token
Headers
- Response status: 401
Body (JSON)
{
"message": "Unauthenticated."
}
General:
- Form detail displayed correctly
- Form link displayed correctly
- User can copy form link
Questions:
- Questions displayed correctly
- Question inputs should be disabled when has created
- Users can add questions by filling in a question form
and clicking the save button.
Detail Form
- Choices input should be displayed when the user
selects multiple choice, dropdown, or checkboxes.
- Alert errors should be displayed when created failed.
- Users can remove questions by clicking the remove
button.
Responses:
- Table displayed correctly according to questions and
responses.
- Total responses count is displayed correctly.
ERD
Instructions
- Save your REST Api in the directory called “SERVER_MODULE/backend”
and save it in the repository folder.
- Save your front-end app in the directory called “SERVER_MODULE/frontend”
and save it in the repository folder.
- When developing the Frontend, you can use/consume the provided REST
API.
- You should build the frontend app to production mode and save the
production files in the “SERVER_MODULE/frontend/build” folder before
you push it to the github repository.
- Make sure the “/build” folder isn't written on the .gitgnore file.
- You should commit and push your changes to the github repository at least
every 30 minutes.
MODULE CLIENT
Contents
1. MODULE_CLIENT.docx
2. MODULE_CLIENT_MEDIA.zip
Introduction
People love to play challenging games which require the player's effort to think. Games
will be more challenging if there are numbers involved. Nevertheless, a multiplayer
game can be more fun if people play it together.
With the support of current sophisticated technology, we can make a game that can
be played in a web browser so people can play it across devices. You need to make
this game run correctly in the latest version of Google Chrome or Mozilla Firefox.
This is a 5 hours module in which you will need to create the initial layout of the game
and the game functionality using Javascript. You are required to make the game work
perfectly in modern browsers without any error.
1. Game title
2. 10x8 hexagon blocks
3. Both players names
4. Both players scores
5. Current hexagon
6. New game button
7. Leaderboard
8. Sort Functionality
Game functionalities
1. Show the game icon as a favicon.
2. Welcome screen should show when the page is loaded.
3. Game instruction should appear besides the welcome screen.
4. The game instruction should appear in an animated way.
30. Score will be saved and displayed in the leaderboard and see the details of
the player’s game by clicking the details button.
31. Scores data should persist in the browser.
32. Players can sort the leaderboard by the winner score or by the date in
descending order.
33. The game should be working correctly in Google Chrome and Mozilla
Firefox by opening the index.html file directly.
34. The game should work without JavaScript errors and messages shown in the
browser console